将某个 JSON 值映射到枚举值 C#

Posted

技术标签:

【中文标题】将某个 JSON 值映射到枚举值 C#【英文标题】:Mapping a certain JSON value to Enum value C# 【发布时间】:2016-03-16 16:34:27 【问题描述】:

我正在为 Stack Exchange API 创建类。 filter_object 类型包含一个成员 filter_type,它将是 safeunsafeinvalid。所以我创建了一个这样的枚举:

[JsonConverter(typeof(StringEnumConverter))]
public enum FilterType

    safe,
    @unsafe, // Here lies the problem.
    invalid

由于unsafe 是一个关键字,我必须为其添加一些前缀。但是如何使值“不安全”自动映射到@unsafe?示例 JSON:


  "filter": "....",
  "filter_type": "unsafe",
  "included_fields": [
    "...",
    "....",
    "....."
  ]

如何反序列化它,使filter_type 自动转换为FilterType.@unsafe

更新 - 已解决:

在标识符之前使用@符号可以与关键字相同。即使 @ 出现在智能感知中,它也能正常工作。

【问题讨论】:

您也可以像在 C# 中对类名等使用大写字母一样。并添加驼峰式转换器,见this question 所以你不接受我的回答,那真的很好:D @AlbertoMonteiro 这不是正确的答案。即使未映射,如果名称正确,它也会自动被解析为正确的枚举。问题是unsafe 是一个关键字。我已经遇到了前缀@,以便可以将关键字用作标识符。它出现在智能感知中,所以我认为它不起作用。但是在测试中我发现它是正确的。看到没有其他答案,我接受了你的。但是,这不是所做的。所以我不接受它并编辑了我的问题以包含解决方案。我看不出有什么不妥。 @AlbertoMonteiro 我会否决它,因为它不是正确的解决方案,但投票已锁定。 JsonProperty 映射到属性,而不是值。因为它已经包含@,所以它起作用了。试试_unsafe。你的方法会抛出异常。 【参考方案1】:

你可以像这样使用JsonProperty

public enum FilterType

    safe,
    [JsonProperty("unsafe")]
    @unsafe, // Here lies the problem.
    invalid

然后它就会正常工作

class MyClass

    public FilterType filter_type  get; set;  


public class Program

    public static void Main()
    
        var myClass = JsonConvert.DeserializeObject<MyClass>(json);
        var itsUnsafe = myClass.filter_type == FilterType.@unsafe;
        Console.WriteLine(itsUnsafe);
    

    public static string json = @"
  ""filter"": ""...."",
  ""filter_type"": ""unsafe"",
  ""included_fields"": [
    ""..."",
    ""...."",
    "".....""
  ]
";

输出是:

是的

您可以在此处查看示例:https://dotnetfiddle.net/6sb3VY

【讨论】:

以上是关于将某个 JSON 值映射到枚举值 C#的主要内容,如果未能解决你的问题,请参考以下文章

将枚举值映射到类型

具有枚举值的映射的 Dart json_serializable defaultValue

反序列化 null 值以使用 Jackson 枚举

Angular:将字符串数组映射到http get调用中的枚举值数组

nhibernate 映射枚举对(键 - 值)

Android:将 json 值映射到 pojo