如何在JSON.NET中实现自定义JsonConverter以反序列化基类对象列表?

蛇字节

我正在尝试扩展此处提供的JSON.net示例http://james.newtonking.com/projects/json/help/CustomCreationConverter.html

我有另一个派生自基类/接口的子类

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Employee : Person
{
    public string Department { get; set; }
    public string JobTitle { get; set; }
}

public class Artist : Person
{
    public string Skill { get; set; }
}

List<Person> people  = new List<Person>
{
    new Employee(),
    new Employee(),
    new Artist(),
};

我如何反序列化跟随Json回到List <Person>

[
  {
    "Department": "Department1",
    "JobTitle": "JobTitle1",
    "FirstName": "FirstName1",
    "LastName": "LastName1"
  },
  {
    "Department": "Department2",
    "JobTitle": "JobTitle2",
    "FirstName": "FirstName2",
    "LastName": "LastName2"
  },
  {
    "Skill": "Painter",
    "FirstName": "FirstName3",
    "LastName": "LastName3"
  }
]

我不想使用TypeNameHandling JsonSerializerSettings。我专门在寻找定制的JsonConverter实现来处理此问题。网上的相关文档和示例很少。我似乎无法正确获得JsonConverter中重写的ReadJson()方法的实现。

戴维斯

使用该标准CustomCreationConverter,我正在努力工作如何生成正确的类型(PersonEmployee),因为要确定此类型,您需要分析JSON,并且没有使用该Create方法来执行此操作的内置方法。

我找到了一个与类型转换有关的讨论线程,事实证明它提供了答案。这是一个链接:类型转换

所需要的是子类化JsonConverter,重写ReadJson方法并创建一个Create接受的新抽象方法JObject

JObject类提供了一种加载JSON对象的方法,并提供了对该对象内数据的访问。

重写的ReadJson方法创建一个JObject并调用该Create方法(由我们的派生转换器类实现),并传入JObject实例。

JObject然后可以通过检查某些字段的存在来分析实例以确定正确的类型。

string json = "[{
        \"Department\": \"Department1\",
        \"JobTitle\": \"JobTitle1\",
        \"FirstName\": \"FirstName1\",
        \"LastName\": \"LastName1\"
    },{
        \"Department\": \"Department2\",
        \"JobTitle\": \"JobTitle2\",
        \"FirstName\": \"FirstName2\",
        \"LastName\": \"LastName2\"
    },
        {\"Skill\": \"Painter\",
        \"FirstName\": \"FirstName3\",
        \"LastName\": \"LastName3\"
    }]";

List<Person> persons = 
    JsonConvert.DeserializeObject<List<Person>>(json, new PersonConverter());

...

public class PersonConverter : JsonCreationConverter<Person>
{
    protected override Person Create(Type objectType, JObject jObject)
    {
        if (FieldExists("Skill", jObject))
        {
            return new Artist();
        }
        else if (FieldExists("Department", jObject))
        {
            return new Employee();
        }
        else
        {
            return new Person();
        }
    }

    private bool FieldExists(string fieldName, JObject jObject)
    {
        return jObject[fieldName] != null;
    }
}

public abstract class JsonCreationConverter<T> : JsonConverter
{
    /// <summary>
    /// Create an instance of objectType, based properties in the JSON object
    /// </summary>
    /// <param name="objectType">type of object expected</param>
    /// <param name="jObject">
    /// contents of JSON object that will be deserialized
    /// </param>
    /// <returns></returns>
    protected abstract T Create(Type objectType, JObject jObject);

    public override bool CanConvert(Type objectType)
    {
        return typeof(T).IsAssignableFrom(objectType);
    }

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

    public override object ReadJson(JsonReader reader, 
                                    Type objectType, 
                                     object existingValue, 
                                     JsonSerializer serializer)
    {
        // Load JObject from stream
        JObject jObject = JObject.Load(reader);

        // Create target object based on JObject
        T target = Create(objectType, jObject);

        // Populate the object properties
        serializer.Populate(jObject.CreateReader(), target);

        return target;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Gson中制作自定义列表反序列化器?

Go中接口的自定义JSON序列化和反序列化

如何在自定义getter中序列化JSON对象?

如何在杰克逊中编写自定义属性反序列化器

如何在Jackson JSON(反序列化)中自定义序列化或转换具有自定义键类型的Map属性?

如何使用Json.Net使用自定义键对字典进行序列化/反序列化?

反序列化Web.API参数时未调用自定义Json.NET JsonConverter

使用JsonConverter的Json.NET自定义序列化-如何获得“默认”行为

如何在Spray JSON中为布尔类型实现自定义反序列化器

使用自定义格式的引用时,如何使用Json.NET通过引用反序列化对象?

如何使用自定义JsonConverter在Json.NET中仅反序列化子对象?

JSON.Net无法在自定义JsonConverter中反序列化JSON数组

如何在C#中反序列化自定义json

如何在Julia中为结构实现自定义序列化/反序列化?

如何使用json.net自定义反序列化为对象

JSON反序列化修改后的类。自定义JSON反序列化方法

序列化json对象中的自定义对象

如何在自定义System.Text.Json JsonConverter中使用默认序列化?

如何使Json.NET序列化和反序列化还实现IDictionary <string,object>的自定义动态类型的声明属性?

使用JsonConverter在C#中自定义JSON反序列化

如何序列化自定义对象列表并在Android中的onRestoreInstanceState上恢复它?

自定义对象列表json在python中序列化

自定义JSON.net序列化和反序列化

如何使用Import-CliXml反序列化自定义类对象的通用列表?

如何在 JSON.NET 中反序列化具有嵌套对象列表的对象列表?

JSON 未反序列化为自定义类

自定义类的对象列表的json序列化

Ktor自定义json对象反序列化

JSON.Net - 如何反序列化自定义类型的嵌套字段