我希望能够获取/设置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; }
}