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
The 3rd party package json.net allows this to be done easily:
Parse the JSON into a LINQ to JSON hierarchy of JToken tokens.
Select JSON values to modify via SelectTokens using a query string in JSONPath syntax.
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?.