有没有一种通用方法可以访问 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"
      }
   ]
}

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

请注意,架构是动态的。

使用 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 脚本。

其他选项包括:

  • 反序列化为dynamic,因此您可以说obj.payload而不是obj["payload"]
  • 反序列化为静态类型(听起来这对您来说不是一个入门,因为架构是动态的(
  • 使用 SelectTokens() 为要更改的元素提供 JsonPath。如果目标对象位于 JSON 有效负载的深处而不是顶层,这可能很有用。

作为@StriplingWarrior答案中的第三个项目符号的示例:

您可以将SelectTokens()与 JsonPath 通配符表达式结合使用,以查找 JSON 中的所有匹配属性,然后修改这些属性。

JToken root = JToken.Parse(json);
foreach (JToken match in root.SelectTokens("payload[*].a"))
{
    match.Replace(new JValue("ZZZZZZZZ"));
}

小提琴:https://dotnetfiddle.net/ZYIchL

这是一个带有 dto 类和 Json.NET 反序列化/序列化的解决方案。此解决方案假定 json 架构是固定的。

    using Newtonsoft.Json;
    using System.Collections.Generic;
    class Program
    {
        static void Main(string[] args)
        {
            var json = @"{
               ""payload"":[
                  {
                     ""a"":""yes"",
                     ""b"":""no"",
                     ""c"":""maybe""
                  },
                  {
                     ""a1"":""agg"",
                     ""b"":""no"",
                     ""c"":""maybe""
                  },
                  {
                     ""a"":""L"",
                     ""b"":""k"",
                     ""c"":""maybe""
                  }
               ]
            }";
            var o= JsonConvert.DeserializeObject<RootObject>(json);
            foreach (var item in o.Payload)
            {
                item.A = "ZZZZZZZZ";
            }
            var convertedJson = JsonConvert.SerializeObject(o);

        }
    }
    public class RootObject
    {
        [JsonProperty("payload")]
        public List<Payload> Payload { get; set; }
    }
    public class Payload
    {
        [JsonProperty("a", NullValueHandling = NullValueHandling.Ignore)]
        public string A { get; set; }
        [JsonProperty("b")]
        public string B { get; set; }
        [JsonProperty("c")]
        public string C { get; set; }
        [JsonProperty("a1", NullValueHandling = NullValueHandling.Ignore)]
        public string A1 { get; set; }
    }

相关内容

  • 没有找到相关文章

最新更新