How do you Add or Update a JProperty Value in a JObject
I am currently using the following extension method to perform this task, but it almost seems like there should be some existing included method or extension to perform this (or at least a subset of this). If there isn't anything within Json.NET then what is the recommended process, or how would I change the code below to be closer to the recommended process.
public static partial class ExtensionMethods
{
public static JObject SetPropertyContent(this JObject source, string name, object content)
{
var prop = source.Property(name);
if (prop == null)
{
prop = new JProperty(name, content);
source.Add(prop);
}
else
{
prop.Value = JContainer.FromObject(content);
}
return source;
}
}
I can confirm the above code works for basic usage, but I'm not certain how well it holds up to broader usage.
The reason I have this extension returning a JObject
is so that you would be able to chain calls (either multiple calls to this extension or to other methods and extensions).
i.e.,
var data = JObject.Parse("{ 'str1': 'test1' }");
data
.SetPropertyContent("str1", "test2")
.SetPropertyContent("str3", "test3");
// {
// "str1": "test2",
// "str3": "test3"
// }
as @dbc described in the comment, you can simply use the indexer to make this happen.
var item = JObject.Parse("{ 'str1': 'test1' }");
item["str1"] = "test2";
item["str3"] = "test3";
see the fiddle for more details
Anyone trying to access nested JSON use the approach as in answer by @pjs adding extra braces as required.
JObject item = JObject.Parse("{
"test": {
"first": "one",
"second": "two",
"nth": "n"
}
}");
To edit:
item["test"]["nth"] = "updated";
Updates the JObject to:
{
"test": {
"first": "one",
"second": "two",
"nth": "updated"
}
}