gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:55:20 25 4
gpt4 key购买 nike

我希望实现 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 convert序列化这样的复杂对象:

{
"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

关于c# - 如何实现将复杂类型序列化/反序列化为简单类型的 Newtonsoft JSON 转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45662158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com