问题
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);
回答1:
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>();
...
}
回答2:
JSON.NET has no direct ability to support both requisites:
- custom name of the property holding the type name
- look for the property anywhere in the object
The first requisites is fulfilled by JsonSubTypes The second one by specifying thh right MetadataPropertyHandling
来源:https://stackoverflow.com/questions/10218827/how-to-cast-jobject-in-json-net-to-t