从 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

符合预期