首页 > 解决方案 > 是否有一种通用的方法来访问模式是动态的 JSON 数组中的对象内的字段?

问题描述

我希望能够获取/设置以下属性值a

{
   "payload":[
      {
         "a":"yes",
         "b":"no",
         "c":"maybe"
      },
      {
         "a1":"agg",
         "b":"no",
         "c":"maybe"
      },
      {
         "a":"L",
         "b":"k",
         "c":"maybe"
      }
   ]
}

我想遍历所有a并获取/设置其值。在伪代码中是这样的:

foreach(var jsonObject in payload)
{
  jsonObject.a = "ZZZZZZZZ";
}

生成的结构将是这样的:

{
   "payload":[
      {
         "a":"ZZZZZZZZ",
         "b":"no",
         "c":"maybe"
      },
      {
         "a1":"agg",
         "b":"no",
         "c":"maybe"
      },
      {
         "a":"ZZZZZZZZ",
         "b":"k",
         "c":"maybe"
      }
   ]
}

我们如何访问数组中对象内的值?

请注意,架构是动态的。

标签: c#.netjsonjson.net

解决方案


使用 JSON.NET 有多种选择。根据我对您的用例的理解,我可能会选择这样的一个:

var jObject = JsonConvert.DeserializeObject<JObject>(json);
foreach (var jsonObject in jObject["payload"])
{
    if (jsonObject["a"] != null)
    {
        jsonObject["a"] = "ZZZZZZZZ";
    }
}

这种方法的一个主要优点是JObject可以将其转换回 JSON(例如,如果您的代码的目的只是进行此更改并再次保存 JSON)。这是一个显示此工作的 LINQPad 脚本。

其他选项包括:

  • 反序列化为 a dynamic,所以你可以说obj.payload而不是obj["payload"]
  • 反序列化为静态类型(由于模式是动态的,这听起来对您来说是一个非首发)
  • SelectTokens()用于为要更改的元素提供 JsonPath 。如果目标对象位于 JSON 有效负载的深处而不是顶层,这将很有用。

推荐阅读