Reputation: 3677
I am trying to add a new node to an existing JSON
JObject
, but when I add it does not format correctly. It adds quotes around the entire node, and \ are put in place.
Background:
I am loading a JSON
file, doing some logic then adding a node back in. Figured I can do it like this:
mainJson.Add("NewNode", JsonConvert.SerializeObject(MyObject));
File.WriteAllText("myfile.json", mainJson.ToString());
Problem is that this is the result:
{
"JSONFile": [
{
"More": "Nodes",
"InThe": "File"
}
],
"Customers": "{\"FirstName\":\"Mike\",\"LastName\":\"Smith\"},{\"FirstName\":\"Jane\",\"LastName\":\"Doe\"}",
}
I know that my JsonConvert.SerializeObject(MyObject) is working if I do this:
string json = JsonConvert.SerializeObject(MyObject);
File.WriteAllText("myfile2.json" json);
The result is this:
[
{
"FirstName": "Mike",
"LastName": "Smith"
},
{
"FirstName": "Jane",
"LastName": "Doe"
}
]
What am I missing?
edit: Following @Swagata Prateek comment of;
mainJson.Add("Customers",JObject.FromObject(MyObject));
An unhandled exception of type 'System.ArgumentException' occurred in Newtonsoft.Json.dll
Additional information: Object serialized to Array. JObject instance expected.
I should note that MyObject is actual ObservableCollection
if that makes a difference
Upvotes: 6
Views: 16337
Reputation: 47
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
JObject tempvar= JObject.Parse(@"{
'CPU': 'Intel',
'Drives': [
'DVD read/writer',
'500 gigabyte hard drive'
]
}");
string cpu = (string)tempvar["CPU"]; // Intel
string firstDrive = (string)tempvar["Drives"][0]; // DVD read/writer
IList<string> allDrives = tempvar["Drives"].Select(t => (string)t).ToList();
// DVD read/writer
// 500 gigabyte hard drive
tempvar["Drives"][0].AddAfterSelf("new node");
//tempvar json with new node
}
}
}
Upvotes: 1
Reputation: 1086
Could you kindly try with this?
mainJson.Add("NewNode", JObject.FromObject(MyObject));
File.WriteAllText("myfile.json", mainJson.ToString());
When you are doing JsonConvert.SerializeObject(MyObject)
it serializes MyObject
and in the process you get a string out of it.
When you assign mainJson.Add("NewNode", JsonConvert.SerializeObject(MyObject));
you're assigning a string to NewNode
. Thus you get a quoted string that represents serialized MyObject
Update:
JArray.FromObject
is the method you'd want to look for if you want to convert your collection to a JArray. In that case the segment would look something like
mainJson.Add("NewNode", JArray.FromObject(obsColl));
File.WriteAllText("myfile.json", mainJson.ToString());
Upvotes: 7