将Json字符串反序列化为Enum C#

时间:2019-05-30 22:23:06

标签: c# json enums deserialization

我正在对stringEnumConverter的自定义版本编写测试。但是当我反序列化时,我的测试一直在抛出。我搜索了堆栈溢出,但是找不到我做错了什么。以下是我在做什么的一个示例:

namespace ConsoleApp2
{
    [Flags]
    [JsonConverter(typeof(StringEnumConverter))]
    enum TestEnum
    {
        none = 0, 
        obj1 = 1,
        obj2 = 2
    }

    class Program
    {
        static void Main(string[] args)
        {
            var jsonString = "{none}";
            var deserializedObject = JsonConvert.DeserializeObject<TestEnum>(jsonString);
        }
    }
}

我在反序列化行上得到的异常是在解析枚举时出现意外的令牌StartObject。

我怀疑可能是因为我表示的json字符串错误,所以我也尝试了"{\"none\"}", "{\"TestEnum\":\"none\"}", "{TestEnum:none}", "{none}" and "none"

2 个答案:

答案 0 :(得分:4)

{none}无效的JSON。

您应该尝试以下操作:

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World");
        var jsonString = "'none'";
        var deserializedObject = JsonConvert.DeserializeObject<TestEnum>(jsonString);
        Console.WriteLine(deserializedObject);
    }
}

干杯!

答案 1 :(得分:0)

如果将"hello" + (", " + s2)序列化为JSON,则结果为TestEnum.none。字符串是完全有效的JSON。

您的JSON甚至不是有效 JSON: *是一个对象, *包含密钥(但密钥必须用双引号引起来), *没有价值。 (并且对象键必须具有值)

所以...尝试这样的事情:

"none"

但是您不必编写自定义序列化程序。 JSON.Net将为您做到这一点。见

.NET - JSON serialization of enum as string

但是,如果您想反序列化包含枚举的对象,则需要遵循以下原则:

var jsonString = "\"none\"";
var deserializedObject = JsonConvert.DeserializeObject<TestEnum>(jsonString);

在您的测试中,会是这样的:

{
  "enumKey" : "none"
}