2016-04-25 85 views
2

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

一个例子是Wikipedia article API。提供JSON响应返回类似于此的Using the API。请注意0​​密钥中的"16689396"

{ 
    "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?

回答

2

听起来像Query类中的Pages属性只需要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

您可以实现自己的DeSerializer或编辑JSON你反序列化之前。

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"];