将特定的JSON值映射到枚举值C#

4

我正在为Stack Exchange API创建类。 filter_object类型包含一个成员filter_type,它将是safeunsafeinvalid之一。因此,我创建了一个枚举如下:

[JsonConverter(typeof(StringEnumConverter))]
public enum FilterType
{
    safe,
    @unsafe, // Here lies the problem.
    invalid
}

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

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

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

更新 - 已解决:

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


在C#中,您也可以像类名一样使用大写字母等。并且可以添加驼峰式转换器,请参见此问题 - huysentruitw
你取消了我的答案,那真是太好了:D - Alberto Monteiro
@AlbertoMonteiro 那不是正确的答案。即使未映射,如果名称正确,它也会自动解析为正确的枚举类型。问题在于 unsafe 是一个关键字。我已经遇到了使用 @ 前缀使关键字可以用作标识符的情况。它出现在 intellisense 中,所以我认为它不起作用。但测试后发现它是正确的。鉴于没有其他答案,我接受了你的回答。然而,这不是正确的做法。因此,我取消了接受,并编辑了我的问题以包含解决方案。我认为这样做没什么问题。 - Fᴀʀʜᴀɴ Aɴᴀᴍ
@AlbertoMonteiro 我本来会给它投反对票的,因为它不是正确的解决方案,但是投票已经锁定了。JsonProperty映射到属性,而不是值。因为它已经包含了@,所以它可以工作。试试使用_unsafe。你的方法会抛出异常。 - Fᴀʀʜᴀɴ Aɴᴀᴍ
1个回答

6
你可以使用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"": [
    ""..."",
    ""...."",
    "".....""
  ]
}";
}

输出结果为:

true

你可以在这里查看示例的运行情况: https://dotnetfiddle.net/6sb3VY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接