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);
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.
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.
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.
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.
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>(); ... }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With