C# 使用SelectTokens查询JSON?使用C中的Newtonsoft.Json.Linq#

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 }, {

我试图使用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
      }
   ]
}
因此,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
    ,可以直接设置到
    JToken
    层次结构中。对于复杂的POCO,在层次结构中设置它之前,需要调用将其序列化为
    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”