Editing JSON using JSONPath

后端 未结 1 641
暗喜
暗喜 2021-01-01 01:52

Hello SO community :)!

I want to create method which will let user to edit (or add) JSON specific value or object (located in JSON by JSONPath). Below simple example

相关标签:
1条回答
  • 2021-01-01 02:42

    The 3rd party package json.net allows this to be done easily:

    1. Parse the JSON into a LINQ to JSON hierarchy of JToken tokens.

    2. Select JSON values to modify via SelectTokens using a query string in JSONPath syntax.

    3. Using JToken.Replace() replace the selected values with the new values. A new value can be serialized directly to a JToken using JToken.FromObject().

    Thus:

    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();
        }    
    }
    

    Then use it like:

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

    Prototype fiddle. If you are going to allow the user to do a series of edits, it will likely be more efficient to keep your JSON in a JToken hierarchy permanently rather that repeatedly converting from and to a string representation.

    See also How to install JSON.NET using NuGet?.

    0 讨论(0)
提交回复
热议问题