How to cast JObject in JSON.Net to T

两盒软妹~` 提交于 2019-12-29 06:39:21

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!