c# - 是否有一种通用的方法来访问模式是动态的 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 脚本。
其他选项包括:
- 反序列化为 a
dynamic
,所以你可以说obj.payload
而不是obj["payload"]
- 反序列化为静态类型(由于模式是动态的,这听起来对您来说是一个非首发)
SelectTokens()
用于为要更改的元素提供 JsonPath 。如果目标对象位于 JSON 有效负载的深处而不是顶层,这将很有用。
推荐阅读
- python - 如何删除与 pandas 合并的 excel 单元格以进行进一步处理?
- python - 我正在尝试做一个 def 语句,但无论我尝试什么都无法让它工作
- javascript - 在 NodeJS 中下载 Dropbox 文件的内容
- python - 重复列表中的某个字符?(Python)
- javascript - 在 javascript 或 jquery 中通过单击和按键触发按钮
- arrays - ZSH 将值视为文字字符串
- vba - 使用 Textrange.replace 时不区分大小写
- python - 我收到运行时警告:使用 ldaseq 时在 double_scalars 中遇到无效值并在 double_scalars 中遇到除以零
- c# - OneNote 插件开发:如何导航到某个页面而不卡住?
- python - 如何在 Discord 服务器上标记随机用户