C# JSON无法获取数据
您好,我正在尝试用C#解析JSON页面,但似乎无法读取一些字符串,例如:C# JSON无法获取数据,c#,json,C#,Json,您好,我正在尝试用C#解析JSON页面,但似乎无法读取一些字符串,例如: "versions": [ { "date": 1340466559, "dl_link": "http://dev.bukkit.org/media/files/599/534/NoSwear.jar", "filename": "NoSwear.jar", "game_builds": [ "CB 1.2.5-R4.0
"versions": [
{
"date": 1340466559,
"dl_link": "http://dev.bukkit.org/media/files/599/534/NoSwear.jar",
"filename": "NoSwear.jar",
"game_builds": [
"CB 1.2.5-R4.0"
],
"hard_dependencies": [],
"md5": "d0ce03e817ede87a9f76f7dfa67a64cb",
"name": "NoSwear v5.1",
"soft_dependencies": [],
"status": "Semi-normal",
"type": "Release"
},
我怎么能读到呢?
这是我现在拥有的代码,适用于除此之外的所有其他代码:
public static void GetMoreInfo(string plugin)
{
try
{
string url = "http://bukget.org/api/plugin/";
var wc = new WebClient();
var json = wc.DownloadString(url + plugin);
var moreInfo = JsonConvert.DeserializeObject<MoreInfo>(json);
foreach (var category in moreInfo.categories)
{
Categories += category + ", ";
}
Categories = Categories.Remove(Categories.Length - 2, 2);
}
catch (Exception)
{
}
finally
{
if (string.IsNullOrEmpty(Categories))
{
Categories = "No data found.";
}
}
}
public class MoreInfo
{
public string[] categories;
}
publicstaticvoid GetMoreInfo(字符串插件)
{
尝试
{
字符串url=”http://bukget.org/api/plugin/";
var wc=新的WebClient();
var json=wc.DownloadString(url+插件);
var moreInfo=JsonConvert.DeserializeObject(json);
foreach(moreInfo.categories中的var类别)
{
类别+=类别+“,”;
}
Categories=Categories.Remove(Categories.Length-2,2);
}
捕获(例外)
{
}
最后
{
if(string.IsNullOrEmpty(类别))
{
Categories=“未找到任何数据。”;
}
}
}
公共类MoreInfo
{
公共字符串[]类别;
}
我可能错了,但您收到的JSON是一个名为versions
的数组,但您试图将其反序列化为一个MoreInfo
对象,该对象公开一个名为categories
的数组(除非您的示例中只是一个输入错误)。您是否尝试将MoreInfo.categories
重命名为MoreInfo.versions
更新
我认为这不会有什么不同,因为JSON转换器不知道如何处理数组中的每个对象。您需要提供一个对象来反序列化JSON数组中的每个元素
例如,尝试修改MoreInfo
对象,将匹配的属性包含到JSON字符串(数组中的元素)中
然后尝试将JSON字符串反序列化为列表
:
JsonConverter.DeserializeObject(json)
然后,您必须修改代码的其余部分,才能使用MoreInfo
对象,而不是数组中的字符串
参考此答案
看到这个问题,接受的答案应该可以帮助您解决问题:我可能错了,但是您收到的JSON是一个名为
版本的数组,但是您试图将其反序列化为一个MoreInfo
对象,该对象公开一个名为类别的数组(除非您的示例中它只是一个输入错误)。您是否尝试将MoreInfo.categories
重命名为MoreInfo.versions
更新
我认为这不会有什么不同,因为JSON转换器不知道如何处理数组中的每个对象。您需要提供一个对象来反序列化JSON数组中的每个元素
例如,尝试修改MoreInfo
对象,将匹配的属性包含到JSON字符串(数组中的元素)中
然后尝试将JSON字符串反序列化为列表
:
JsonConverter.DeserializeObject(json)
然后,您必须修改代码的其余部分,才能使用MoreInfo
对象,而不是数组中的字符串
参考此答案
看到这个问题,公认的答案应该可以帮助您解决问题:动态地处理json而不是反序列化到具体的类如何
var wc = new WebClient();
var json = wc.DownloadString("http://bukget.org/api/plugin/test");
dynamic moreInfo = JsonConvert.DeserializeObject(json);
Console.WriteLine("{0} {1} {2}", moreInfo.name, moreInfo.desc, moreInfo.status);
string categories = String.Join(",", moreInfo.categories);
Console.WriteLine(categories);
还是你更喜欢经典的方法
var plugin = JsonConvert.DeserializeObject<Plugin>(json);
string categories = String.Join(",",plugin.categories);
public class Plugin
{
public List<string> authors;
public string bukkitdev_link;
public List<string> categories;
public string desc;
public string name;
public string plugin_name;
public string status;
public List<Version> versions;
}
public class Version
{
public string date;
public string filename;
public string name;
//.......
}
var plugin=JsonConvert.DeserializeObject(json);
string categories=string.Join(“,”,plugin.categories);
公共类插件
{
公开名单作者;
公共字符串bukkitdev_链接;
公开名单类别;
公共字符串描述;
公共字符串名称;
公共字符串插件名称;
公共字符串状态;
公开列表版本;
}
公共类版本
{
公共字符串日期;
公共字符串文件名;
公共字符串名称;
//.......
}
动态处理json而不是反序列化到具体类怎么样
var wc = new WebClient();
var json = wc.DownloadString("http://bukget.org/api/plugin/test");
dynamic moreInfo = JsonConvert.DeserializeObject(json);
Console.WriteLine("{0} {1} {2}", moreInfo.name, moreInfo.desc, moreInfo.status);
string categories = String.Join(",", moreInfo.categories);
Console.WriteLine(categories);
还是你更喜欢经典的方法
var plugin = JsonConvert.DeserializeObject<Plugin>(json);
string categories = String.Join(",",plugin.categories);
public class Plugin
{
public List<string> authors;
public string bukkitdev_link;
public List<string> categories;
public string desc;
public string name;
public string plugin_name;
public string status;
public List<Version> versions;
}
public class Version
{
public string date;
public string filename;
public string name;
//.......
}
var plugin=JsonConvert.DeserializeObject(json);
string categories=string.Join(“,”,plugin.categories);
公共类插件
{
公开名单作者;
公共字符串bukkitdev_链接;
公开名单类别;
公共字符串描述;
公共字符串名称;
公共字符串插件名称;
公共字符串状态;
公开列表版本;
}
公共类版本
{
公共字符串日期;
公共字符串文件名;
公共字符串名称;
//.......
}
您所说的“似乎无法读取字符串”是什么意思?我看到您正在吞咽所有异常,因此您永远不会知道是否抛出了任何可能给您提供线索的内容。如果您注释掉try会发生什么?另外,您是否正在尝试将发布的JSON解析为MoreInfo的实例?在这种情况下,我认为MoreInfo的类定义需要与JSON匹配,而不仅仅是一个string[]字段。意外标记:星光。路径“版本”,第13行,位置18。
在我添加公共字符串版本之后代码>对于类moreinfo您所说的“似乎无法读取字符串”是什么意思?我看到您正在吞咽所有异常,因此您永远不会知道是否抛出了任何可能给您提供线索的内容。如果您注释掉try会发生什么?另外,您是否正在尝试将发布的JSON解析为MoreInfo的实例?在这种情况下,我认为MoreInfo的类定义需要与JSON匹配,而不仅仅是一个string[]字段。意外标记:星光。路径“版本”,第13行,位置18。
在我添加公共字符串版本之后代码>到类MoreInfofigure。我认为您需要执行一个JsonConverter.DeserializeObject(json)
并修改MoreInfo
以包含适当的属性。您有什么建议吗?我对JSON非常陌生:(.因为现在它变成了一个列表:o.更新了我的答案。您收到的JSON代表了一个对象列表,因此对于