2017-08-17 201 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 –

相關問題