【问题标题】:Json.NET (Newtonsoft) to parse somewhat dynamic data (c#)Json.NET(Newtonsoft)解析一些动态数据(c#)
【发布时间】:2017-07-15 19:47:30
【问题描述】:

使用 c# - 我有一个有效的 json 字符串,并且正在尝试将其解析为字典,但正在努力使用语法。

这是我要解析的数据示例:

{
  "data": {
    "KeyOne": {
      "val": "first!"
      "fooBar": "invalid data not needed",
    },
    "anotherKey": {
      "val": null
    },
    "TheThirdKey": {
      "val": 999
      "fooFooBarBar": "more unneeded data",
    },
    "KeyKeyKey": {
      "val": "super neato something"
    },
    ...

这需要通过一些相当具体的规则移入Dictionary<string, object>

  1. 不断变化的元素名称是键('KeyOne'、'anotherKey'...) - 这在数据集中是唯一的
  2. 对于字典值,我需要'val'的值的字符串或数字或null('first',null,999,...)

所以我的最终字典应该是这样的:

"KeyOne"     : "first!"
"anotherKey" : null
"TheThirdKey": 999
"KeyKeyKey"  : "super neato something"

我尝试使用不同的变体来解析这个

JsonConvert.DeserializeObject<Dictionary<string, object>

我也尝试过像这样迭代 jToken:

JObject jObject = JObject.Parse(jsonString);
List<JToken> jTokens = jObject["data"].Children().ToList();
foreach (JToken jToken in jTokens) { ...

但是经过这么多小时的尝试,我尴尬地无处可去...希望这是可以使用 Json.NET 执行的操作,但我还没有弄清楚。

想法?

【问题讨论】:

    标签: c# json serialization deserialization json-deserialization


    【解决方案1】:

    你可以这样做:

    JObject jObject = JObject.Parse(jsonString);
    var dataChildren = jObject["data"].Children().Cast<JProperty>();
    Dictionary<string, object> result = dataChildren
           .ToDictionary(x => x.Name, x => x.Value["val"].Value<JValue>().Value);
    

    结果你会得到一个Dictionary&lt;string,object&gt;

    【讨论】:

    • 谢谢!这完全符合预期,并且是超级干净的代码:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多