Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to cast JObject in JSON.Net to T

I know that I can use JsonConvert.DeserializeObject<T>(string), however, I need to peek into the object's _type (which may not be the first parameter) in order to determine the specific class to cast to. Essentially, what I am wanting to do is something like:

//Generic JSON processor for an API Client. function MyBaseType ProcessJson(string jsonText) {   var obj = JObject.Parse(jsonText);   switch (obj.Property("_type").Value.ToString()) {     case "sometype":       return obj.RootValue<MyConcreteType>();       //NOTE: this doesn't work...        // return obj.Root.Value<MyConcreteType>();     ...   } } ...  // my usage... var obj = ProcessJson(jsonText); var instance = obj as MyConcreteType; if (instance == null) throw new MyBaseError(obj); 
like image 215
Tracker1 Avatar asked Apr 18 '12 22:04

Tracker1


People also ask

How do you access JObject values?

The simplest way to get a value from LINQ to JSON is to use the Item[Object] index on JObject/JArray and then cast the returned JValue to the type you want. JObject/JArray can also be queried using LINQ.

How do I convert JProperty to JObject?

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.

Is a JObject a JToken?

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.

What is JObject C#?

JObject. It represents a JSON Object. It helps to parse JSON data and apply querying (LINQ) to filter out required data. It is presented in Newtonsoft.


1 Answers

First parse the JSON into a JObject. Then lookup the _type attribute using LINQ to JSON. Then switch depending on the value and cast using ToObject<T>:

var o = JObject.Parse(text); var jsonType = (String)o["_type"];  switch(jsonType) {     case "something": return o.ToObject<Type>();     ... } 
like image 72
yamen Avatar answered Sep 27 '22 20:09

yamen