使用Newtonsoft.JSON反序列化具有默认值的枚举

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

我有一个像这样的json字符串

{
  'EnumValue': 'Foo'
}

我正在将此值反序列化为带有可能值BarBaz的枚举的类。由于此枚举中不包含"Foo",因此使用Newtonsofts JsonConverter将此字符串转换为类实例会引发错误。有什么方法可以在我的枚举中包含一个捕获所有任意值的默认值?可以在this fiddle中找到该代码。

c# serialization enums json.net default
2个回答
0
投票

[如果我还记得,Json.NET被指示使用[JsonConverter(typeof(StringEnumConverter))]属性将枚举值序列化/反序列化为字符串。

public enum CarGenre
{
    [EnumMember(Value = "Sport Car")]
    Sport,
    [EnumMember(Value = "Home Car")]
    Home
}

-

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

public class Car
{
    public string CarName { get; set; }

    [JsonConverter(typeof(StringEnumConverter))]
    public CarGenre Genre { get; set; }
}

这将产生以下JSON:

{
    "CarName": "something",
    "Genre": "Home Car"
}

在上面的示例中,如果在枚举声明中未提供[EnumMember(Value =“ Home Car”]),则采用枚举值的字符串表示形式:

{
    "CarName": "something",
    "Genre": "Home"
}

0
投票

根据我从how Newtonsoft parses enums的了解,这是不可能的。

您可以尝试添加字符串属性并将其解析为get属性(Fiddle here):

public SampleEnum EnumRealValue {
    get {
        if(Enum.TryParse<SampleEnum>(EnumValue, out SampleEnum result)) {
            return result;
        } else {
            return default(SampleEnum);
        }
    }
}
public string EnumValue {get; set;}
© www.soinside.com 2019 - 2024. All rights reserved.