将json字符反序列化为枚举

Sel*_*Net 21 c# json enumeration json.net json-deserialization

我有一个用C#定义的枚举,我将它的值存储为字符,如下所示:

public enum CardType
{
    Artist = 'A',
    Contemporary = 'C',
    Historical = 'H',
    Musician = 'M',
    Sports = 'S',
    Writer = 'W'
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用JSON.NET反序列化,但传入的JSON是使用CHAR值(字符串)而不是枚举的int值编写的,如下所示:

[{"CardType","A"},{"CardType", "C"}]
Run Code Online (Sandbox Code Playgroud)

是否可以定义某种转换器,允许我手动将char解析为枚举值?

我尝试创建一个JsonConverter,但不知道该怎么做,同时只将它应用于此属性而不是整个解析对象.这是我试过的:

public class EnumerationConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
        {
            return null;
        }

        int value = serializer.Deserialize<int>(reader);
        return (CardType)value;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType.IsSubclassOf(typeof(string));
    }
}
Run Code Online (Sandbox Code Playgroud)

逻辑可能是错误的,我可以解决这个问题,但问题是ReadJson()根本没有被调用.

CanConvert是,但它似乎是为每个属性调用,而不仅仅是我为其定义的一个属性:

public class Card
{
            private CardType type;
        [JsonConverter(typeof(EnumerationConverter))]
        public CardType Type
        {
            get { return type; }
            set { type = value; }
        }
}
Run Code Online (Sandbox Code Playgroud)

我确定我做错了但是我找不到如何为单个字段执行此操作的文档...

我错过了什么?

nem*_*esv 32

你不需要一个自定义JsonConverter你可以使用内置StringEnumConverter的组合EnumMemberAttribute(从System.Runtime.Serialization组件).

没有EnumMemberAttribute它使用枚举名称,如艺术家,当代等,所以你需要将它的名称更改为你的A,C等值.

但它不是最好的解决方案,因为你必须重复两次你的值,但它有效:

[JsonConverter(typeof(StringEnumConverter))]
public enum CardType
{
    [EnumMember(Value = "A")]
    Artist = 'A',
    [EnumMember(Value = "C")]
    Contemporary = 'C',
    [EnumMember(Value = "H")]
    Historical = 'H',
    [EnumMember(Value = "M")]
    Musician = 'M',
    [EnumMember(Value = "S")]
    Sports = 'S',
    [EnumMember(Value = "W")]
    Writer = 'W'
}
Run Code Online (Sandbox Code Playgroud)

  • 如何反序列化上述?我在反序列化方面遇到了问题.实施例:服务具有该枚举:[EnumMember(值= "当代")]当代= 'C',UI代码具有该枚举:[EnumMember(值= "当代")]当代= 'C' 所以,虽然反序列化,它无法找到"Contemp"..有没有办法做到这一点?或者只是将Enum和Value互换,[EnumMember(Value ="ontemporary")] Contemp ='C', (3认同)

Vla*_*mir 6

这段代码很完美:

CardType[] array = { CardType.Artist, CardType.Contemporary };
string s = JsonConvert.SerializeObject(array);
var array2 = JsonConvert.DeserializeObject<CardType[]>(s);
Run Code Online (Sandbox Code Playgroud)

更新:
开箱即用StringEnumConverter:

[JsonConverter(typeof(StringEnumConverter))]
public CardType Type { get; set; }
Run Code Online (Sandbox Code Playgroud)