2016-03-04 138 views
4

你好SO社區:)!使用JSONPath編輯JSON

我想創建一個方法,讓用戶編輯(或添加)JSON特定值或對象(位於JSON中的JSONPath)。下面是一個簡單的例子,我的想法是什麼用戶總是輸入JSON,JSONPath和值/對象進行更改。我正在使用Json.NET庫。

方法輸入 {JSON,jsonpath,valuetoedit} || 輸出 {新JSON作爲字符串}

示例輸入:

{ "store": { 
    "book": [ 
     { "category": "reference", 
     "author": "Nigel Rees", 
     "title": "Sayings of the Century", 
     "price": 8.95 
     }, 
     { "category": "fiction", 
     "author": "Evelyn Waugh", 
     "title": "Sword of Honour", 
     "price": 12.99 
     }, 
     { "category": "fiction", 
     "author": "Herman Melville", 
     "title": "Moby Dick", 
     "isbn": "0-553-21311-3", 
     "price": 8.99 
     }, 
     { "category": "fiction", 
     "author": "J. R. R. Tolkien", 
     "title": "The Lord of the Rings", 
     "isbn": "0-395-19395-8", 
     "price": 22.99 
     } 
    ], 
    "bicycle": { 
     "color": "red", 
     "price": 19.95 
    } 
    } 
} 

例JSONPath:

$.store.book[*].author 

值示例改變:

NewAuthorSpecifiedByUser 

輸出 - 新的JSON,其中所有作者將被更改爲「NewAuthorSpecifiedByUser」。

這可能嗎?

+0

採用「先代碼先行」的方法並將JSON反序列化爲對象圖,修改對象圖,然後序列化回JSON不是更容易嗎?特別是對於更大更復雜的JSON,我認爲更新爲「POCO」會更快,而不是嘗試按路徑更新json。我的意思是,你擁有C#的所有功能,而不是一些使用麻煩的JavaScript(開玩笑)的開發者! – code4life

回答

2

第三方包使得這很容易做到:

  1. 解析JSON成LINQ to JSON層次JToken令牌。

  2. 通過SelectTokens使用JSONPath syntax中的查詢字符串選擇JSON值進行修改。使用JToken.Replace()將所選值替換爲新值。可以使用JToken.FromObject()將新值直接序列化爲JToken

因此:

public static class JsonExtensions 
{ 
    public static JToken ReplacePath<T>(this JToken root, string path, T newValue) 
    { 
     if (root == null || path == null) 
      throw new ArgumentNullException(); 

     foreach (var value in root.SelectTokens(path).ToList()) 
     { 
      if (value == root) 
       root = JToken.FromObject(newValue); 
      else 
       value.Replace(JToken.FromObject(newValue)); 
     } 

     return root; 
    }  

    public static string ReplacePath<T>(string jsonString, string path, T newValue) 
    { 
     return JToken.Parse(jsonString).ReplacePath(path, newValue).ToString(); 
    }  
} 

然後使用它像:

var newJsonAuthorString = JsonExtensions.ReplacePath(jsonString, @"$.store.book[*].author", "NewAuthorSpecifiedByUser"); 

原型fiddle。如果您打算允許用戶進行一系列編輯,那麼將永久保存您的JSON爲JToken層次結構可能更有效,而不是將其重複轉換爲字符串表示形式。請參閱How to install JSON.NET using NuGet?

+0

工程就像一個魅力。非常感謝! –