您好我正在尝试用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"
],
"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;
}
答案 0 :(得分:4)
如何处理你的json dynamically
,而不是反序列化为具体的类?
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;
//.......
}
答案 1 :(得分:0)
我可能是错的,但是您收到的JSON是一个名为versions
的数组,但您尝试将其反序列化为MoreInfo
对象,该对象公开名为categories
的数组(除非你的例子只是一个错字)。您是否尝试将MoreInfo.categories
重命名为MoreInfo.versions
?
<强>更新强>
我认为这不会有所作为,因为JSON转换器不知道如何处理数组中的每个对象。您需要提供一个对象来反序列化JSON数组中的每个元素。
例如,尝试修改MoreInfo
对象以包含与JSON字符串匹配的属性(数组中的元素)
[DataContract]
public class MoreInfo
{
[DataMember]
public DateTime date { get; set; }
[DataMember]
public string dl_link { get; set; }
...
}
然后尝试将JSON字符串反序列化为List<MoreInfo>
:
JsonConverter.DeserializeObject<List<MoreInfo>>(json)
然后,您必须修改其余代码以使用MoreInfo
个对象,而不是数组中的字符串。
请参阅此答案
请参阅此问题,接受的答案可以帮助您解决问题:Json.NET: Deserialization with list of objects