Json.Net以索引作为名称反序列化JSON对象

时间:2014-01-31 01:35:11

标签: c# json json.net xamarin

我试图使用Json.NET从Web服务解析JSON,Web服务以下列格式返回数据:

{
    "0": {
        "ID": 193,
        "Title": "Title 193",
        "Description": "Description 193",
        "Order": 5,
        "Hyperlink": "http://someurl.com"
    },
    "1": {
        "ID": 228,
        "Title": "Title 228",
        "Description": "Description 228",
        "Order": 4,
        "Hyperlink": "http://someurl.com"
    },
    "2": {
        "ID": 234,
        "Title": "Title 234",
        "Description": "Description 234",
        "Order": 3,
        "Hyperlink": "http://someurl.com"
    }
}

我使用json2sharp从JSON生成一个类:

public class __invalid_type__0
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public int Order { get; set; }
    public string Hyperlink { get; set; }
}

public class __invalid_type__1
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public int Order { get; set; }
    public string Hyperlink { get; set; }
}

public class __invalid_type__2
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public int Order { get; set; }
    public string Hyperlink { get; set; }
}

public class RootObject
{
    public __invalid_type__0 __invalid_name__0 { get; set; }
    public __invalid_type__1 __invalid_name__1 { get; set; }
    public __invalid_type__2 __invalid_name__2 { get; set; }
}

然后我清理了课程并留下了以下内容:

public class Articles
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public int Order { get; set; }
    public string Hyperlink { get; set; }
}

public class FeaturedArticles
{
    public List<Articles> articles { get; set; }
}

当我尝试将数据加载到我的单例中以便在应用程序中使用时:

    private void fetchFeaturedArticles()
    {
        var client = new RestClient (_featuredArticlesJsonUrl);
        var request = new RestRequest (Method.GET);
        var response = client.Execute (request);
        _featuredArticles = JsonConvert.DeserializeObject<FeaturedArticles> (response.Content);

        foreach (Articles a in _featuredArticles.Articles)
            Console.WriteLine (a.Title);
    }

我发现文章没有被反序列化。

我已经验证了从Web服务返回的JSON数据。我相信这个问题存在于我的JSON提要结构中,其中从提要返回的每个项目都被赋予一个名称,该名称等于该项目返回的索引。

我是使用Json.NET的新手,所以我不确定我该怎么做;我无法更改JSON提要的结构,但需要使用它的数据。有人有什么建议吗?

1 个答案:

答案 0 :(得分:4)

您不需要FeaturedArticles类,您可以将JSON反序列化为Dictionary<string, Articles>,如下所示:

private void fetchFeaturedArticles()
{
    var client = new RestClient (_featuredArticlesJsonUrl);
    var request = new RestRequest (Method.GET);
    var response = client.Execute (request);

    Dictionary<string, Articles> _featuredArticles = JsonConvert.DeserializeObject<Dictionary<string, Articles>>(response.Content);

    foreach (string key in _featuredArticles.Keys)
    {
        Console.WriteLine(_featuredArticles[key].Title);
    }

}

演示:https://dotnetfiddle.net/ZE1BMl