Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用JObject修改集合中的JSON字段_C#_.net_Json_Wcf_Json.net - Fatal编程技术网

C# 使用JObject修改集合中的JSON字段

C# 使用JObject修改集合中的JSON字段,c#,.net,json,wcf,json.net,C#,.net,Json,Wcf,Json.net,我试图在JSON数组集合中的JSON消息中更改字段值。不幸的是,JSON.net文档显示了如何修改除集合字段之外的所有内容 使用下面的JSON消息结构和fiddler代码,我需要修改testParams的params数组中的第一个value元素字段,但我无法使其工作。它在cJson[“value”]=“New value”上抛出“对象引用未设置为对象实例”异常行,因为cJson为空,所以我必须做一些错误的操作来引用该字段位置。有人能帮我解决这个问题吗 using Newtonsoft.Json;

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

使用下面的JSON消息结构和fiddler代码,我需要修改
testParams
的params数组中的第一个
value
元素字段,但我无法使其工作。它在
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));

    }
}
更改“value”字段后,输出应如下所示

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

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

JObject cJson = (JObject)item.SelectToken("testParams.params[0]");
小提琴:

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

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

你能负担得起使用dynamic吗?