【发布时间】:2021-09-09 22:10:53
【问题描述】:
我最近开始使用来自 Microsoft Dynamics 365 dataverse 的 JSON 结构。他们的很多 odata 的结构是这样的:
{
"@odata.context":"https://....",
"value":[
{
"@odata.etag":"W/\"Jz....",
"dataAreaId":"foo",
"ItemNumber":"TEST",
"IsPhantom":"No"
}
]
}
我只想获取ItemNumber 的值,在本例中为TEST。这看起来应该很简单,但是经过一个小时和十几种不同的方法,我想知道我错过了什么。
当使用Newtsonsoft 时,似乎他们所有的方法都需要一个完全匹配 json 结构的完整类,以及<T> 复杂组合的正确规范。这很乏味,因为我使用了许多不同的 json 数据集,而且几乎所有数据集在属性及其类型方面都彼此不同。我试过这样的事情:
dynamic try1 = JsonConvert.DeserializeObject<dynamic>(jsonResult);
dynamic try2 = JObject.Parse(jsonResult);
dynamic try3 = JsonConvert.DeserializeObject<ExpandoObject>(jsonResult, new ExpandoObjectConverter());
JObject try4 = (JObject)JsonConvert.DeserializeObject<dynamic>(jsonResult);
然后我放弃了 Newtonsoft 并尝试了JavaScriptSerializer,但也遇到了类似的死胡同。
var try5 = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(jsonResult);
string try6 = Utilities.SafeTrim(jsonObj["value"]);
在每种情况下,我都会得到一个有效的对象,但我永远无法弄清楚如何向下遍历对象并获取我想要的值。我经常从 VS 监视窗口中得到完全无用的结构,它提供这些结构只是为了嘲笑我:
new System.Linq.SystemCore_EnumerableDebugView<System.Collections.Generic.KeyValuePair<string, Newtonsoft.Json.Linq.JToken>>(new System.Linq.SystemCore_EnumerableDebugView<Newtonsoft.Json.Linq.JToken>((new System.Linq.SystemCore_EnumerableDebugView<System.Collections.Generic.KeyValuePair<string, Newtonsoft.Json.Linq.JToken>>(try1).Items[1]).Value).Items[0]).Items[2]
我确信有人有正确而优雅的方法来解决这个问题,这很好。但我真正喜欢的是一种将任何 JSON 字符串转换为对象、数组或集合的方法,我可以使用嵌套数组语法(或同样简单的方法)轻松梳理出任何值。所以对于我的例子,可能是这样的:
jsonObject["value"]["ItemNumber"]
这样的事情有那么难吗?
【问题讨论】:
-
在你的情况下它会是
jsonObject["value"][0]["ItemNumber"]- 但是它可以正常工作...... -
不,这行不通。
-
我将代码作为答案,只是因为它更容易格式化