从 D365 dataverse JSON 检索值的最简单方法?
Easiest way to retrieve values from D365 dataverse JSON?
我最近开始使用 Microsoft Dynamics 365 dataverse
的 JSON 结构。他们的很多 odata 结构如下:
{
"@odata.context":"https://....",
"value":[
{
"@odata.etag":"W/\"Jz....",
"dataAreaId":"foo",
"ItemNumber":"TEST",
"IsPhantom":"No"
}
]
}
我只想获取 ItemNumber
的值,在本例中为 TEST
。这看起来应该很简单,但是在一个小时和十几种不同的方法之后,我想知道我错过了什么。
当使用 Newtsonsoft
时,似乎他们所有的方法都需要完全匹配 json 结构的完全成熟的 class,以及 [= 的复杂组合的正确规范20=]。这很乏味,因为我使用许多不同的 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 watch window 得到完全无用的结构,它只是为了嘲笑我而提供的:
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"]
这么难吗?
此代码:
const string jsonInput = @"{
'odata.context':'https://....',
'value':[{
'@odata.etag':'W/z....',
'dataAreaId':'foo',
'ItemNumber':'TEST',
'IsPhantom':'No'
}]}";
dynamic try1 = JsonConvert.DeserializeObject(jsonInput)!;
Console.WriteLine(try1["value"][0]["ItemNumber"]);
returns
TEST
符合预期
我最近开始使用 Microsoft Dynamics 365 dataverse
的 JSON 结构。他们的很多 odata 结构如下:
{
"@odata.context":"https://....",
"value":[
{
"@odata.etag":"W/\"Jz....",
"dataAreaId":"foo",
"ItemNumber":"TEST",
"IsPhantom":"No"
}
]
}
我只想获取 ItemNumber
的值,在本例中为 TEST
。这看起来应该很简单,但是在一个小时和十几种不同的方法之后,我想知道我错过了什么。
当使用 Newtsonsoft
时,似乎他们所有的方法都需要完全匹配 json 结构的完全成熟的 class,以及 [= 的复杂组合的正确规范20=]。这很乏味,因为我使用许多不同的 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 watch window 得到完全无用的结构,它只是为了嘲笑我而提供的:
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"]
这么难吗?
此代码:
const string jsonInput = @"{
'odata.context':'https://....',
'value':[{
'@odata.etag':'W/z....',
'dataAreaId':'foo',
'ItemNumber':'TEST',
'IsPhantom':'No'
}]}";
dynamic try1 = JsonConvert.DeserializeObject(jsonInput)!;
Console.WriteLine(try1["value"][0]["ItemNumber"]);
returns
TEST
符合预期