C#:如何覆盖默认的JSON转换器

问题描述 投票:2回答:1

我希望以下Author类型具有默认的JsonConverter,并能够在运行时覆盖它。

[JsonConverter(typeof(BaseJsonConverter))]
public class Author
{
    // The ID of an author entity in the application.
    public int ID { set; get; }

    // The ID of an Author entity in its source.
    public string SourceID { set; set; }
}

我使用以下代码替代默认转换器(即BaseJsonConverter)。

public class AlternativeConverter : BaseJsonConverter
{ // the serializer implementation is removed for clarity. }

// Deserialize using AlternativeConverter:
var author = JsonConvert.DeserializeObject<Author>(jsonString, new AlternativeConverter());

问题

使用上述调用,首先构造AlternativeConverter;但是,BaseJsonConverter的实例被初始化并用于反序列化。因此,从不使用AlternativeConverter

Executable example: https://dotnetfiddle.net/l0bgYO


用例

该应用程序将从不同来源获得的不同JSON对象转换为通用C#类型。通常,数据来自一个源,因为我们定义了默认转换器(即BaseJsonConverter),对于来自其他源的数据,我们每个都定义了不同的转换器。


背景

我知道诸如this one之类的方法,实际上我正在部分使用类似的方法。在引用该文章时,我需要根据输入的来源使用不同的_propertyMappings,因为在我的应用程序中,属性到属性的映射不是一对一的。例如,我有以下JSON对象:

{
   "id":123
}

// and

{
   "id":"456"
}

第一个JSON对象应反序列化为:

author.ID = 123
author.SourceID = null

并且第二个JSON对象应反序列化为:

author.ID = 0
author.SourceID = "456"
c# json .net-core json.net
1个回答
0
投票

我认为您应该尝试对具有不同JsonSerializerSettings集合的不同数据源使用不同的Converters实例。并从类中删除JsonConverter属性。

© www.soinside.com 2019 - 2024. All rights reserved.