使用 JObject 修改集合中的 JSON 字段
Posted
技术标签:
【中文标题】使用 JObject 修改集合中的 JSON 字段【英文标题】:Modifying a JSON field within a collection using JObject 【发布时间】:2018-12-29 14:32:20 【问题描述】:我正在尝试更改 JSON 数组集合中的 JSON 消息中的字段 value
。不幸的是,JSON.net 文档显示了如何修改集合字段以外的所有内容。
使用以下 JSON 消息结构和提琴手代码,我需要修改 testParams
的 params 数组中的第一个 value
元素字段,但我无法使其工作。它在cJson["value"] = "New value";
行上引发“对象引用未设置为对象的实例”异常,因为cJson
为空,所以我必须做一些不正确的事情来引用该字段位置。谁能帮我解决这个问题?
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
public class Program
public static void Main()
String json = @"
'codeName': '',
'testParams':
'params': [
'name': '',
'value': ''
,
'name': '',
'value': ''
]
";
var item = JObject.Parse(json);
JObject cJson = (JObject)item["testParams.params[0]"];
cJson["value"] = "New value";
Console.WriteLine(item.ToString(Formatting.Indented));
“值”字段更改后的输出应如下所示。
'codeName': '',
'testParams':
'testobj': [
'name': '',
'value': 'New value'
,
'name': '',
'value': ''
]
【问题讨论】:
你能负担得起使用动态吗? 【参考方案1】:问题是您将 JSON 路径表达式传递给 JObject
上的索引器。这将不起作用,因为索引器希望参数字符串是实际的属性名称。由于 JSON 的根目录中没有属性(字面意思是 testParams.params[0]
),因此索引器将返回 null。如果要使用路径表达式,则需要改用SelectToken()
方法。
JObject cJson = (JObject)item.SelectToken("testParams.params[0]");
小提琴:https://dotnetfiddle.net/XXx06N
作为参考,使用索引器语法的等效方法如下:
JObject cJson = (JObject)item["testParams"]["params"][0];
【讨论】:
以上是关于使用 JObject 修改集合中的 JSON 字段的主要内容,如果未能解决你的问题,请参考以下文章
如何使 Newtonsoft.Json.Linq.JObject 不可变?