首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何用Newtonsoft JSON.NET将JSON反序列化为IEnumerable<BaseType>

如何用Newtonsoft JSON.NET将JSON反序列化为IEnumerable<BaseType>
EN

Stack Overflow用户
提问于 2011-06-15 02:26:30
回答 4查看 77.7K关注 0票数 74

给定此JSON:

代码语言:javascript
复制
[
  {
    "$id": "1",
    "$type": "MyAssembly.ClassA, MyAssembly",
    "Email": "me@here.com",
  },
  {
    "$id": "2",
    "$type": "MyAssembly.ClassB, MyAssembly",
    "Email": "me@here.com",
  }
]

以及这些类:

代码语言:javascript
复制
public abstract class BaseClass
{
    public string Email;
}
public class ClassA : BaseClass
{
}
public class ClassB : BaseClass
{
}

如何将JSON反序列化为:

代码语言:javascript
复制
IEnumerable<BaseClass> deserialized;

我不能使用JsonConvert.Deserialize<IEnumerable<BaseClass>>(),因为它抱怨BaseClass是抽象的。

EN

回答 4

Stack Overflow用户

发布于 2017-09-12 19:57:20

这里有一种不需要在json中填充$type的方法。

一个Json转换器:

代码语言:javascript
复制
public class FooConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(BaseFoo));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        if (jo["FooBarBuzz"].Value<string>() == "A")
            return jo.ToObject<AFoo>(serializer);

        if (jo["FooBarBuzz"].Value<string>() == "B")
            return jo.ToObject<BFoo>(serializer);

        return null;
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

使用它:

代码语言:javascript
复制
var test = JsonConvert.DeserializeObject<List<BaseFoo>>(result, new JsonSerializerSettings() 
{ 
    Converters = { new FooConverter() }
});

摘自here

票数 33
EN

Stack Overflow用户

发布于 2014-01-14 18:02:41

反序列化时使用以下JsonSerializerSettings结构:

代码语言:javascript
复制
new JsonSerializerSettings()
{
    TypeNameHandling = TypeNameHandling.Objects
})
票数 7
EN

Stack Overflow用户

发布于 2011-06-27 23:50:22

您还可以将enumerable包装在一个类中:

代码语言:javascript
复制
class Wrapper
{
    IEnumerable<BaseClass> classes;
}

然后对其进行序列化和反序列化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6348215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档