使用Json.NET反序列化包含数字键的JSON

时间:2016-04-25 21:13:59

标签: c# json json.net

我想将以下JSON(使用Json.NET)反序列化为对象,但不能,因为类名需要以数字开头。

这方面的一个例子是Wikipedia article APIUsing the API提供JSON响应返回类似这样的内容。请注意"16689396"键内的"pages"

{
   "batchcomplete":"",
   "continue":{
      "grncontinue":"0.893378504602|0.893378998188|35714269|0",
      "continue":"grncontinue||"
   },
   "query":{
      "pages":{
         "16689396":{
            "pageid":16689396,
            "ns":0,
            "title":"Jalan Juru",
            "extract":"<p><b>Jalan Juru</b> (Penang state road <i>P176</i>) is a major road in Penang, Malaysia.</p>\n\n<h2><span id=\"List_of_junctions\">List of junctions</span></h2>\n<p></p>\n<p><br></p>"
         }
      }
   }
}

如何反序列化包含根据文章更改的数字的JSON?

3 个答案:

答案 0 :(得分:4)

听起来Pages课程中的Query属性只需Dictionary<int, Page>Dictionary<string, Page>

使用您提供的JSON完成示例 - 我不得不猜测一些名称含义:

using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;

public class Root
{
    [JsonProperty("batchcomplete")]
    public string BatchComplete { get; set; }
    [JsonProperty("continue")]
    public Continuation Continuation { get; set; }
    [JsonProperty("query")]
    public Query Query { get; set; }
}

public class Continuation
{
    [JsonProperty("grncontinue")]
    public string GrnContinue { get; set; }
    [JsonProperty("continue")]
    public string Continue { get; set; }
}

public class Query
{
    [JsonProperty("pages")]
    public Dictionary<int, Page> Pages { get; set; }
}

public class Page
{
    [JsonProperty("pageid")]
    public int Id { get; set; }
    [JsonProperty("ns")]
    public int Ns { get; set; }
    [JsonProperty("title")]
    public string Title { get; set; }
    [JsonProperty("extract")]
    public string Extract { get; set; }
}

class Test
{
    static void Main()
    {
        string text = File.ReadAllText("test.json");
        var root = JsonConvert.DeserializeObject<Root>(text);
        Console.WriteLine(root.Query.Pages[16689396].Title);
    }    
}

答案 1 :(得分:3)

相关问题:Json deserialize from wikipedia api with c#

基本上,您需要将使用页面的类更改为字典,这允许命名约定的动态特性。

班级定义

public class pageval
{
    public int pageid { get; set; }
    public int ns { get; set; }
    public string title { get; set; }
    public string extract { get; set; }
}

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

public class Limits
{
    public int extracts { get; set; }
}

public class RootObject
{
    public string batchcomplete { get; set; }
    public Query query { get; set; }
    public Limits limits { get; set; }
}

反序列化

var root = JsonConvert.DeserializeObject<RootObject>(__YOUR_JSON_HERE__);
var page = responseJson.query.pages["16689396"];

答案 2 :(得分:1)

您可以在DeSerialize之前实现自己的DeSerializer或编辑JSON。