如何实现将复杂类型序列化/反序列化为简单类型的 Newtonsoft JSON 转换器

刚刚M

我正在寻找实施https://github.com/HeadspringLabs/Enumeration目前,当我尝试序列化/反序列化一个 Enumeration 时,它会将它序列化为一个复杂的对象。例如,对象颜色:

public class Color : Enumeration<Color, int>
{
    public static readonly Color Red = new Color(1, "Red");
    public static readonly Color Blue = new Color(2, "Blue");
    public static readonly Color Green = new Color(3, "Green");

    private Color(int value, string displayName) : base(value, displayName) { }
}

将序列化为

{ 
    "_value": 2, 
    "_displayName": "Something" 
}

在像这样的复杂对象中:

public class OtherClass
{
    public Color Color {get; set;}
    public string Description {get; set;}
}

它会像这样序列化:

{
    "Description" : "Other Description",
    "Color" :
    { 
        "_value": 2, 
        "_displayName": "Something" 
    }
}

有没有办法让json转换像这样序列化复杂的对象:

{
    "Description" : "Other Description",
    "Color" : 2
}

我可以通过使用 Enumeration 类中的方法 FromValue 从值创建正确的 Color 对象。我似乎无法让 json convert 将属性值作为 Color 对象的“值”。

为了实现这一点,我可以通过什么方式编写转换器的 WriteJson 和 Create 方法?

public class EnumerationConverter : JsonCreationConverter<IEnumeration>
        {
            public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
            {
            }

            protected override IEnumeration Create(Type objectType, JObject jObject)
            {
            }
        }
布赖恩·罗杰斯

您可以为您的Headspring.Enumeration<T, int>派生类制作一个通用转换器,如下所示:

class EnumerationConverter<T> : JsonConverter where T : Headspring.Enumeration<T, int>
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(T);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        int val = Convert.ToInt32(reader.Value);
        return Headspring.Enumeration<T, int>.FromValue(val);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var enumVal = (Headspring.Enumeration<T, int>)value;
        writer.WriteValue(enumVal.Value);
    }
}

要使用转换器,请[JsonConverter]向您的枚举类添加一个属性,如下所示:

[JsonConverter(typeof(EnumerationConverter<Color>))]
public class Color : Headspring.Enumeration<Color, int>
{
    public static readonly Color Red = new Color(1, "Red");
    public static readonly Color Blue = new Color(2, "Blue");
    public static readonly Color Green = new Color(3, "Green");

    private Color(int value, string displayName) : base(value, displayName) { }
}

这是一个往返演示:https : //dotnetfiddle.net/CZsQab

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

您如何使用newtonsoft JSON反序列化器反序列化Geopoint?

将字符串转换为类型时出错-Newtonsoft JSON反序列化

如何反序列化 Json Newtonsoft

如何使用 NewtonSoft Json 反序列化为具有可变类型属性的类?

Newtonsoft JSON反序列化为null

自定义JSON转换器可帮助反序列化为确切原始类型的对象

如何使用 system.text.json 创建类似于 Newtonsoft 的自定义转换器?

Newtonsoft Json 在反序列化为字符串时转换日期时间格式

Newtonsoft JSON反序列化

使用 NewtonSoft 反序列化 JSON

如何使用字符串枚举转换器进行JSON反序列化?

如何将JSON字符串反序列化为不同的复杂类类型?

通过转换器与反序列化转换Json String

使用 Newtonsoft.Json 反序列化 C# 对象时出错:将值“xxx”转换为类型“System.String[]”时出错

Newtonsoft.Json-反序列化自定义类型时引发DeserializeObject:将值“ somestring”转换为CustomType时出错

如何通过NewtonSoft反序列化对象json列表?

如何使用 Newtonsoft.Json 反序列化?

如何使用Newtonsoft在Vb.net中反序列化更复杂的Json Doc

如何使用 Newtonsoft 反序列化复杂的 JSON?(NASA API Neo Feed)

使用自定义转换器从流中反序列化Json

JSON Newtonsoft C# 反序列化不同类型的对象列表

使用 Newtonsoft 库在不同应用程序之间反序列化类型处理的 json

JSON反序列化器继承的通用类型

Newtonsoft.Json - 如何根据传递的对象属性类型选择要反序列化的构造函数?

Newtonsoft json将复杂对象反序列化为具有不同名称的类

使用Newtonsoft.Json反序列化时如何忽略类型

如何将serde_json :: Value转换为实现反序列化特征的具体类型?

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

反序列化Json Array Newtonsoft.Json