2017-08-17 209 views

回答

0

编辑:经过google'ing有点我注意到.SelectToken()!当提到XPath时,这是我想到的。

// Inpup JSON 
string input = "{ body: { name: { firstname: 'John', lastname: 'Doe' }, age: 43 } }"; 
JToken json = JToken.Parse(input); // Parsed to JToken as type may not be known. 

// Select token based on JSONPath, see: http://goessner.net/articles/JsonPath/ 
JToken nameToken = json.SelectToken("$['body']['name']"); 
nameToken["middlename"] = "something"; 

// Prints: {"body":{"name":{"firstname":"John","lastname":"Doe","middlename":"something"},"age":43}} 
string output = json.ToString(Newtonsoft.Json.Formatting.None); 

OLD:
好像你想要的东西,例如Xpath的JSON。所以你可以找到一个现有的对象/数组并添加到?

我的建议是为Json搜索现有的路径工具。 这里是你可以怎么做一个快速和肮脏的例子:

static void Main(string[] args) 
    { 
     string input = "{ body: { name: { firstname: 'John', lastname: 'Doe' }, age: 43 } }"; 

     JToken json = JToken.Parse(input); 

     UpdateJson(json, "body/name/middlename", "Something"); 

     // {"body":{"name":{"firstname":"John","lastname":"Doe","middlename":"Something"},"age":43}} 
     string output = json.ToString(Newtonsoft.Json.Formatting.None); 

     UpdateJson(json, "body/jobs", new JArray(){ "C# Dev", "Network Master" }); 

     // {"body":{"name":{"firstname":"John","lastname":"Doe","middlename":"Something"},"age":43,"jobs":["C# Dev","Network Master"]}} 
     string output2 = json.ToString(Newtonsoft.Json.Formatting.None); 
    } 

    private static void UpdateJson(JToken source, string path, JToken value) 
    { 
     UpdateJsonInternal(source, path.Split('/'), 0, value); 
    } 

    private static void UpdateJsonInternal(JToken source, string[] path, int pathIndex, JToken value) 
    { 
     if (pathIndex == path.Length - 1) 
     { 
      if (source is JArray) 
      { 
       ((JArray)source)[int.Parse(path[pathIndex])] = value; 
      } 
      else if (source is JObject) 
      { 
       ((JObject)source)[path[pathIndex]] = value; 
      } 
     } 
     else if (source is JArray) 
     { 
      UpdateJsonInternal(((JArray)source)[int.Parse(path[pathIndex])], path, pathIndex + 1, value); 
     } 
     else if (source is JObject) 
     { 
      UpdateJsonInternal(((JObject)source)[path[pathIndex]], path, pathIndex + 1, value); 
     } 
    } 
} 

这增加或更新与指定路径的JToken价值的源泉。 所以'body/name/middlename'或者将'middlename'添加到'name'或者用'value'更新它。如果'name'不存在,这个例子简单地失败。

+0

感谢彼得快速响应。 –

+0

感谢Peter和Kevin的快速回复。如何从路径主体/名称中获取JObject,以便我可以设置jObject [“middlename”] =“something”;而不是迭代。根据我的要求,用户必须输入路径,属性。这里的属性可以是名称和值对或JSON数据本身。所以我需要jObject [property] = value; –

+0

好的,我搜索了一下,发现'.SelectToken()'。这个功能允许你选择一个基于路径的json令牌。你可以阅读更多的路径:http://goessner.net/articles/JsonPath/ 我已经编辑了我的答案一个简单的例子 –

0

你可以用Newtonsoft.Json

 var input = "{ test: true }"; 

     var jObject = JObject.Parse(input); 

     jObject["updated"] = true; 
     jObject["array"] = new JArray("item1", "item2", "item3"); 

     var s = jObject.ToString(); 

     // { test: true, updated: true, array: ["item1", "item2", "item3"] } 
     Console.WriteLine(s); 

上面我们已经分析到一个JObject JSON字符串,然后与JObject我们可以开始添加字段进行修改等等。然后找回我们在JObject上调用ToString的字符串表示。

+0

谢谢凯文。有没有什么办法设置JSON值没有属性名称,只需追加到现有的JSON –

相关问题