Gop*_*ath 3 c# linq json json.net
我试图在 C# 中使用 Netwonsoft.JSON.Linq 来更改以下 JSON 中的“statusCode”值:
{
"disbursements":[
{
"id":"1f337641",
"contactId":"f5eb2",
"statusCode":166000005,
"amount":8,
"category":166000001
},
{
"id":"027a4762",
"contactId":"f5eb2038",
"statusCode":166000000,
"amount":4000,
"category":166000000
}
]
}
Run Code Online (Sandbox Code Playgroud)
因此,JSON 数据内部是:“disbursements”,它是 JSON 数组。我必须将数组中每个项目的“statusCode”更改为166000005
. 我可以使用检索第一个的状态代码
JObject jsonText = JObject.Parse(bodyText);
var statusCode = (int)jsonText.SelectToken("disbursements[0].statusCode");
Run Code Online (Sandbox Code Playgroud)
但我需要一个带有循环或 LINQ 的解决方案来更改所有值,而不仅仅是第一个值。
以下代码设置或添加"statusCode": 166000005
到支付数组中的每个条目:
var jsonText = JObject.Parse(bodyText);
foreach (var disbursement in jsonText.SelectTokens("disbursements[*]"))
{
disbursement["statusCode"] = 166000005;
}
Run Code Online (Sandbox Code Playgroud)
笔记:
查询字符串"disbursements[*]"
包含JSONPath通配符运算符[*]
。该运算符匹配父元素下的所有数组元素"disbursement"
。
Json.NET 支持 JSONPath 语法,如使用JSONPath 查询 JSON中所述。
SelectTokens()
使用而不是SelectToken()
循环遍历多个可能的匹配。
项目JToken
设置器 disbursement["statusCode"] = 166000005
将替换该"statusCode"
属性(如果存在),如果不存在则添加它。
一个简单的原子值166000005
可以直接设置到JToken
层次结构中。对于复杂的 POCO,您需要先调用JToken.FromObject()
将其序列化为 a JToken
,然后再将其设置到层次结构中,例如:
disbursement["statusCode"] =
JToken.FromObject( new { oldValue = disbursement["statusCode"], newValue = 166000005 } );
Run Code Online (Sandbox Code Playgroud).Net fiddle工作示例。