Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSON.NET: Obtain JObject from JProperty Value

Tags:

json.net

I'm stuck on something:

I deserialized a JSON file using JObject.Load:

// get the JSON into an object 
JObject jsonObject = JObject.Load(new
  JsonTextReader(new StreamReader("mydoc.json")));

Fine. I now have a populate jsonObject.

Now I iterate through its properties like this:

foreach (JProperty jsonRootProperty in jsonObject.Properties())
  {    
    if (jsonRootProperty.Name=="Hotel")
    {
      ... !!! I just want a JObject here...
    }
  }

Once I find a property with a Name equal to "Hotel", I want that property's value as a JObject. The catch is that the Hotel property name might be a single value (say, a string), or it might be a JSON object or a JSON array.

How can I get the property's value into a JObject variable so that I can pass it to another function that accepts a JObject parameter?

like image 904
Jazimov Avatar asked Jul 05 '16 15:07

Jazimov


People also ask

How do I get keys for JObject?

You can simply convert the JObject into a Dictionary object and access the method Keys() from the Dictionary object.

How do I iterate through a JToken?

If you look at the documentation for JObject , you will see that it implements IEnumerable<KeyValuePair<string, JToken>> . So, you can iterate over it simply using a foreach : foreach (var x in obj) { string name = x. Key; JToken value = x.

What is the difference between JToken and JObject?

So you see, a JObject is a JContainer , which is a JToken . Here's the basic rule of thumb: If you know you have an object (denoted by curly braces { and } in JSON), use JObject. If you know you have an array or list (denoted by square brackets [ and ] ), use JArray.


1 Answers

Get the Value of the JProperty, which is a JToken, and look at its Type. This property will tell you if the token is an Object, Array, String, etc. If the token type is Object, then you can simply cast it to a JObject and pass it to your function. If the token type is something other than Object and your function has to have a JObject, then you'll need to wrap the value in a JObject in order to make it work.

foreach (JProperty jsonRootProperty in jsonObject.Properties())
{    
    if (jsonRootProperty.Name=="Hotel")
    {
        JToken value = jsonRootProperty.Value;
        if (value.Type == JTokenType.Object)
        {
            FunctionThatAcceptsJObject((JObject)value);
        }
        else
        {
            FunctionThatAcceptsJObject(new JObject(new JProperty("value", value)));
        }
    }
}
like image 101
Brian Rogers Avatar answered Oct 22 '22 11:10

Brian Rogers