我正在尝试在JSON数组集合内的JSON消息中更改字段value
。不幸的是,JSON.net文档显示了如何修改除集合字段以外的所有内容。
使用以下JSON消息结构和提琴手代码,我需要修改value
的params数组内的第一个testParams
元素字段,但无法使其工作。由于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': ''
}
]
}
}
答案 0 :(得分:2)
问题是您正在将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];