【问题标题】:Easiest way to retrieve values from D365 dataverse JSON?从 D365 dataverse JSON 中检索值的最简单方法是什么?
【发布时间】: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"] - 但是它可以正常工作......
  • 不,这行不通。
  • 我将代码作为答案,只是因为它更容易格式化

标签: c# json json.net


【解决方案1】:

这段代码:

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"]);

返回

测试

如预期的那样

【讨论】:

  • 非常感谢,菲利克斯。它确实有效。 :-)
猜你喜欢
  • 2018-01-12
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多