首页 > 解决方案 > 使用 JObject 修改集合中的 JSON 字段

问题描述

我正在尝试更改valueJSON 数组集合中的 JSON 消息中的字段。不幸的是,JSON.net 文档显示了如何修改集合字段以外的所有内容。

使用以下 JSON 消息结构和提琴手代码,我需要修改valueparams 数组中的第一个元素字段testParams,但我无法使其工作。它在行上抛出“对象引用未设置为对象的实例”异常,cJson["value"] = "New value";因为cJson它是空的,所以我必须做一些不正确的事情来引用该字段位置。谁能帮我解决这个问题?

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;

public class Program
{
    public static void Main()
    {
        String json = @"{
          'codeName': '',
          'testParams': {
            'params': [
              {
                'name': '',
                'value': ''
              },
              {
                'name': '',
                'value': ''
              }
            ]
          }
        }";

        var item = JObject.Parse(json);
        JObject cJson = (JObject)item["testParams.params[0]"]; 
        cJson["value"] = "New value";
        Console.WriteLine(item.ToString(Formatting.Indented));

    }
}

更改“值”字段后,输出应如下所示。

{
  'codeName': '',
  'testParams': {
    'testobj': [
      {
        'name': '',
        'value': 'New value'
      },
      {
        'name': '',
        'value': ''
      }
    ]
  }
}

标签: c#.netjsonwcfjson.net

解决方案


问题是您将 JSON 路径表达式传递给JObject. 这将不起作用,因为索引器希望参数字符串是实际的属性名称。由于 JSON 的根目录中没有字面称为 的属性testParams.params[0],因此索引器将返回 null。如果要使用路径表达式,则需要改用该SelectToken()方法。

JObject cJson = (JObject)item.SelectToken("testParams.params[0]");

小提琴:https ://dotnetfiddle.net/XXx06N

作为参考,使用索引器语法的等效方法如下:

JObject cJson = (JObject)item["testParams"]["params"][0]; 

推荐阅读