解析动态JSON

use*_*274 1 c# json json.net

我收到的JSON文件包含一个文件列表,每个文件都有一个数字,表示它包含的总行数.文件名可以随时间变化.JSON.NET是否提供了处理此方案的机制?

在下面的示例JSON中,我对noOfProductsByFile下的项目特别感兴趣.文件列表是可变的,我需要通过某种类型的动态对象来使用它们.

{
  "noOfProductsByFileType" : {
    "rdi_product_stuff" : 41228,
    "rdi_product_junk" : 62519,
    "rdi_product_otherStuff" : 165023,
    "rdi_product_bobsJunk" : 1289
  },
  "startTime" : "20160907050000",
  "endTime" : "20160907052713",
  "timeTaken" : "27 minutes and 13 seconds",
  "noOfProductsBySecurityType" : {
    "AGENCIES" : 41228,
    "ASTBK" : 50991,
    "TSYCURV" : 78
  },
  "noOfProductsByFile" : {
    "rdi_product_stuff_1_of_1.json" : 41228,
    "rdi_product_junk_1_of_2.json" : 60219,
    "rdi_product_junk_2_of_2.json" : 2300,
    "rdi_product_myStuff_1_of_2.json" : 147690,
    "rdi_product_myStuff_2_of_2.json" : 17333,
    "rdi_product_test_1_of_1.json" : 1289
  },
  "noOfProducts" : 1925914
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ery 9

有几个选项可供使用.这是使用ExpandObject的一个

dynamic dynData = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, new ExpandoObjectConverter());
Run Code Online (Sandbox Code Playgroud)

然后,您可以像普通对象一样引用字段:

dynData.noOfProductsByFileType.rdi_product_stuff
Run Code Online (Sandbox Code Playgroud)

如果您需要处理可能存在或不存在的字段,可以将ExpandoObjects强制转换为IDictionary并引用字段,如下所示:

((IDictionary<string,object>)dynData)["noOfProductsByFileType"]
Run Code Online (Sandbox Code Playgroud)

分配给IDictionary类型并迭代属性或测试属性是否存在

var dictData = (IDictionary<string,object>)dynData;
var noOfProductsByFileTypeDict = (IDictionary<string,object>)dynData.noOfProductsByFileType; // objects within objects
Run Code Online (Sandbox Code Playgroud)

物业测试

dictData.containsKey("testprop"); // test for a property - testprop
Run Code Online (Sandbox Code Playgroud)

或者迭代

foreach (KeyValuePair<string, int> pair in noOfProductsByFileTypeDict) ... //iterate
Run Code Online (Sandbox Code Playgroud)