Editing JSON using JSONPath

亡梦爱人 提交于 2019-11-30 10:15:53

The 3rd party package 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?.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!