Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Exception creating JSON with LINQ

I am trying to create JSON with the following code:

JArray jInner = new JArray("document");
JProperty jTitle = new JProperty("title", category);
JProperty jDescription = new JProperty("description", "this is the description");
JProperty jContent = new JProperty("content", content);
jInner.Add(jTitle);
jInner.Add(jDescription);
jInner.Add(jContent);

when I get to the jInner.Add(jTitle), I get the following exception:

System.ArgumentException: Can not add Newtonsoft.Json.Linq.JProperty to Newtonsoft.Json.Linq.JArray.
   at Newtonsoft.Json.Linq.JContainer.ValidateToken(JToken o, JToken existing)
   at Newtonsoft.Json.Linq.JContainer.InsertItem(Int32 index, JToken item, Boolean skipParentCheck)
   at Newtonsoft.Json.Linq.JContainer.AddInternal(Int32 index, Object content, Boolean skipParentCheck)

Can anybody help and tell me what am I doing wrong?

like image 304
Klaus Avatar asked Mar 20 '15 14:03

Klaus


1 Answers

It doesn't make sense to add a property to an array. An array consists of values, not key/value pairs.

If you want something like this:

[ {
  "title": "foo",
  "description": "bar"
} ]

then you just need an intermediate JObject:

JArray jInner = new JArray();
JObject container = new JObject();
JProperty jTitle = new JProperty("title", category);
JProperty jDescription = new JProperty("description", "this is the description");
JProperty jContent = new JProperty("content", content);
container.Add(jTitle);
container.Add(jDescription);
container.Add(jContent);
jInner.Add(container);

Note that I've removed the "document" argument from the JArray constructor call too. It's not clear why you had it, but I strongly suspect you don't want it. (It would have made the first element of the array the string "document", which would be fairly odd.)

like image 136
Jon Skeet Avatar answered Nov 15 '22 03:11

Jon Skeet