0

您好我正在尝试在 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;
}
4

2 回答 2

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;
    //.......
}
于 2012-07-16T19:15:56.600 回答
0

我可能是错的,但是您收到的 JSON 是一个名为的数组versions,但您试图将其反序列化为一个MoreInfo对象,该对象公开一个名为的数组categories(除非它只是您的示例中的错字)。您是否尝试过重命名MoreInfo.categoriesMoreInfo.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

于 2012-07-16T18:42:03.783 回答