JSON无法获取数据

时间:2012-07-16 18:34:32

标签: 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"
        ], 
        "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;
}

2 个答案:

答案 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