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

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 的解决方案来更改所有值,而不仅仅是第一个值。

dbc*_*dbc 6

以下代码设置或添加"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工作示例。