【问题标题】:Deserialize Json string to Enum C#将 Json 字符串反序列化为枚举 C#
【发布时间】:2019-05-30 22:23:05
【问题描述】:

我正在编写一个自定义版本的 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"

【问题讨论】:

  • {none} 不是一个有效的 json 开头。
  • 一个有效的 json 应该是这样的:{test: none}

标签: c# json enums deserialization


【解决方案1】:

{none} 不是有效的 JSON,但 'none' 是有效的!

您应该尝试以下方法:

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

干杯!

【讨论】:

    【解决方案2】:

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

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

    所以...试试这样的:

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

    但您不必编写自定义序列化程序。 JSON.Net 会为你做这件事。见

    .NET - JSON serialization of enum as string

    但是如果你想反序列化一个包含你的枚举的对象,你会想要一些类似的东西:

    {
      "enumKey" : "none"
    }
    

    在你的测试中会是这样的:

    var jsonString = "{ \"enumKey\" : \"none\" }";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 2011-01-08
      • 2012-02-27
      • 2021-06-10
      • 2019-02-28
      • 1970-01-01
      相关资源
      最近更新 更多