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

时间:2017-09-14 20:19:14

标签: c# json linq 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
      }
   ]
}

因此,JSON数据内部是:“支出”,即JSON数组。我必须将数组中每个项目的“statusCode”更改为166000005。我可以使用

检索第一个的statusCode
JObject jsonText = JObject.Parse(bodyText);
var statusCode = (int)jsonText.SelectToken("disbursements[0].statusCode");

但是我需要一个带有循环或LINQ的解决方案来改变所有的值,而不仅仅是第一个。

2 个答案:

答案 0 :(得分:0)

以下代码为支付数组中的每个条目设置或添加"statusCode": 166000005

var jsonText = JObject.Parse(bodyText);
foreach (var disbursement in jsonText.SelectTokens("disbursements[*]"))
{
    disbursement["statusCode"] = 166000005;
}

注意:

  • 查询字符串"disbursements[*]"包含JSONPath通配符运算符[*]。此运算符匹配父元素"disbursement"下的所有数组元素。

    Json.NET支持Querying JSON with JSONPath中记录的JSONPath语法。

  • 使用
  • SelectTokens()而不是SelectToken()来循环遍历多个可能的匹配。

  • JToken item setter disbursement["statusCode"] = 166000005将替换"statusCode"属性(如果存在),如果不存在则添加。

  • 可以将166000005等简单的原子值直接设置为JToken层次结构。对于复杂的POCO,您需要在层次结构中设置它之前调用JToken.FromObject()将其序列化为JToken,例如:

    disbursement["statusCode"] = 
        JToken.FromObject( new { oldValue = disbursement["statusCode"], newValue = 166000005 } );
    

示例工作.Net fiddle

答案 1 :(得分:0)

我会创建表示数据的类。这是我的解决方案:

创建数据持有者类:

public class Disbursement
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("contactId")]
    public string ContactId { get; set; }

    [JsonProperty("statusCode")]
    public int StatusCode { get; set; }

    [JsonProperty("amount")]
    public int Amount { get; set; }

    [JsonProperty("category")]
    public int Category { get; set; }
}

收藏品:

public class Disbursements
{
    [JsonProperty("disbursements")]
    public List<Disbursement> Items { get; set; } = new List<Disbursement>();
}

然后加载/修改/保存数据:

class Program
{
    static void Main(string[] args)
    {
        var disbursements =
            JsonConvert.DeserializeObject<Disbursements>(
                File.ReadAllText(
                    "data.json",
                    Encoding.UTF8
                )
            );

        foreach (var disbursement in disbursements.Items)
        {
            disbursement.StatusCode = 166000005;
        }

        string modifiedContent = JsonConvert.SerializeObject(disbursements);

        File.WriteAllText(
            "modifiedData.json",
            modifiedContent,
            Encoding.UTF8
        );
    }
}
相关问题