使用 C# 和 Json.Net 进行解析

4

一个API向我返回了以下的json:

{
   "query":{
      "pages":{
         "49123":{
            "pageid":49123,
            "ns":0,
            "title":"Phoenix (constellation)",
            "revisions":[
               {
                  "revid":588710862,
                  "parentid":588710834
               }
            ]
         }
      }
   }
}

我用 json2csharp 构建了一个表示这个 json 的类(我手动调整了 PageInfo 的名称,因为它无法识别这个名称并将其称为 __invalid_type__49123)。
public class Revision
{
    public int revid { get; set; }
    public int parentid { get; set; }
}

public class PageInfo
{
    public int pageid { get; set; }
    public int ns { get; set; }
    public string title { get; set; }
    public List<Revision> revisions { get; set; }
}

public class Pages
{
    public PageInfo pageInfo { get; set; }
}

public class Query
{
    public Pages pages { get; set; }
}

public class RootObject
{
    public Query query { get; set; }
}

并尝试对其进行解析:

        var json = "{\"query\":{\"pages\":{\"49123\":{\"pageid\":49123,\"ns\":0,\"title\":\"Phoenix (constellation)\",\"revisions\":[{\"revid\":588710862,\"parentid\":588710834}]}}}}";
        // unescaped version of json below
        // {"query":{"pages":{"49123":{"pageid":49123,"ns":0,"title":"Phoenix (constellation)","revisions":[{"revid":588710862,"parentid":588710834}]}}}}

        var root = JsonConvert.DeserializeObject<RootObject>(json);

我可以检查和查看root.query.pages都有值,但pageInfo为null。我不确定缺少什么使我能够将此JSON加载到对象中。


这是因为49123没有映射到Pages类中的PageInfo属性。这是一个有趣的情况,因为它看起来特定元素在JSON中是PageId的值,所以对于您的JSON字符串的每个实例都会不同。如果它是一个常量,您可以在Pages类中的PageInfo属性上使用[JsonProperty(PropertyName = "Myname")]装饰。 - Shiva
1个回答

6

请将您的类定义更改如下,它将起作用...(参见Query类的定义)

public class Revision
{
    public int revid { get; set; }
    public int parentid { get; set; }
}

public class Page
{
    public int pageid { get; set; }
    public int ns { get; set; }
    public string title { get; set; }
    public List<Revision> revisions { get; set; }
}

public class Query
{
    public Dictionary<string,Page>  pages { get; set; }
}

public class RootObject
{
    public Query query { get; set; }
}

你的答案有一个错别字。Query类的定义应该如下所示。public class Query { public Dictionary<string, PageInfo> pages { get; set; } } 我已经更新了你的答案。我测试过了,它可以工作。 - Shiva
@Shiva,我的代码里没有PageInfo。我撤销了你的编辑。 - L.B
哦,刚看到你把OP的“PageInfo”类改成了“Page”类。我复制了OP的代码,并从你的代码中添加了“Query”类,没有注意到你已经重命名了“PageInfo”类。我的错。 - Shiva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接