我收到一个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
}
有几个选项可以使用。这是一个使用扩展对象
dynamic dynData = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, new ExpandoObjectConverter());
然后,您可以像引用普通对象一样引用字段:
dynData.noOfProductsByFileType.rdi_product_stuff
如果需要处理可能存在或不存在的字段,可以将 ExpandoObjects 强制转换为 IDictionary 并引用字段,如下所示:
((IDictionary<string,object>)dynData)["noOfProductsByFileType"]
分配给 IDictionary 类型并循环访问属性或测试属性是否存在
var dictData = (IDictionary<string,object>)dynData;
var noOfProductsByFileTypeDict = (IDictionary<string,object>)dynData.noOfProductsByFileType; // objects within objects
属性测试
dictData.containsKey("testprop"); // test for a property - testprop
或迭代
foreach (KeyValuePair<string, int> pair in noOfProductsByFileTypeDict) ... //iterate
是的。有许多方法可以处理此问题。一种简单的方法是使用 JObject
.
var jsonString = "...";
var jObject = JObject.Parse(jsonString);
foreach (JProperty e in jObject["noOfProductsByFile"])
{
var file = e.Name;
var noOfProducts = e.Value;
Debug.WriteLine(file);
Debug.WriteLine(noOfProducts);
}