C# 使用SelectTokens查询JSON?使用C中的Newtonsoft.Json.Linq#
我试图使用C#中的Netwonsoft.JSON.Linq来更改以下JSON中的“statusCode”值:C# 使用SelectTokens查询JSON?使用C中的Newtonsoft.Json.Linq#,c#,json,linq,json.net,C#,Json,Linq,Json.net,我试图使用C#中的Netwonsoft.JSON.Linq来更改以下JSON中的“statusCode”值: { "disbursements":[ { "id":"1f337641", "contactId":"f5eb2", "statusCode":166000005, "amount":8, "category":166000001 }, {
{
"disbursements":[
{
"id":"1f337641",
"contactId":"f5eb2",
"statusCode":166000005,
"amount":8,
"category":166000001
},
{
"id":"027a4762",
"contactId":"f5eb2038",
"statusCode":166000000,
"amount":4000,
"category":166000000
}
]
}
因此,JSON数据中有:“支付”,即JSON数组。我必须将数组中每个项目的“状态代码”更改为166000005
。我可以使用
JObject jsonText = JObject.Parse(bodyText);
var statusCode = (int)jsonText.SelectToken("disbursements[0].statusCode");
但我需要一个使用loop或LINQ的解决方案,它可以更改所有值,而不仅仅是第一个值。以下代码设置或添加
“statusCode”:166000005
到支付数组中的每个条目:
var jsonText = JObject.Parse(bodyText);
foreach (var disbursement in jsonText.SelectTokens("disbursements[*]"))
{
disbursement["statusCode"] = 166000005;
}
注:
- 查询字符串
包含通配符操作符“放款[*]”
。此运算符匹配父元素“支付”下的所有数组元素 Json.NET支持JSONPath语法,如中所述[*]
- 使用而不是
循环遍历多个可能的匹配项SelectToken()
JToken
将替换放款[“statusCode”]=166000005
属性(如果存在),如果不存在则添加该属性“statusCode”
- 一个简单的原子值,如
,可以直接设置到166000005
层次结构中。对于复杂的POCO,在层次结构中设置它之前,需要调用将其序列化为JToken
,例如:JToken
disbursement["statusCode"] = JToken.FromObject( new { oldValue = disbursement["statusCode"], newValue = 166000005 } );
示例工作。我将创建类来表示数据。以下是我的解决方案: 创建数据持有者类:
公共类支出
{
[JsonProperty(“id”)]
公共字符串Id{get;set;}
[JsonProperty(“contactId”)]
公共字符串ContactId{get;set;}
[JsonProperty(“状态代码”)]
公共int状态码{get;set;}
[JsonProperty(“金额”)]
公共整数金额{get;set;}
[JsonProperty(“类别”)]
公共int类{get;set;}
}
收藏:
公共类支出
{
[JsonProperty(“付款”)]
公共列表项{get;set;}=new List();
}
然后加载/修改/保存数据:
类程序
{
静态void Main(字符串[]参数)
{
风险值支付=
JsonConvert.DeserializeObject(
File.ReadAllText(
“data.json”,
编码.UTF8
)
);
foreach(放款中的var放款。项目)
{
放款状态代码=166000005;
}
string modifiedContent=JsonConvert.SerializeObject(放款);
File.writealText(
“modifiedData.json”,
修改内容,
编码.UTF8
);
}
}
1)能否请您提出问题以提供有效的JSON示例?您当前的JSON在验证时失败。也许您只需要外部大括号{
和}
?2) 您写道,我可以通过“支付[0][“statCode”]”检索状态代码。你能告诉我们你尝试了什么,为什么不起作用,这样我们就不必猜测并提供你不需要的答案吗?看。这不是有效的JSON,但为什么你不能循环你的对象Newtonsoft为你反序列化?这是你想要的吗。我只想将statusCode值更改为“166000008”