![](/img/trans.png)
[英]Newtonsoft Json deserialize Complex type to Flat basic type
[英]How to implement a Newtonsoft JSON converter that will serialize/deserialize a complex type into a simple type
我希望實現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轉換將屬性值作為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>
-derived類創建一個通用轉換器,如下所示:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.