【问题标题】:JsonConverter will not convert enum with dashes(hyphens)JsonConverter 不会用破折号(连字符)转换枚举
【发布时间】:2021-02-05 20:07:10
【问题描述】:

我正在尝试使用 .NET Core (5) System.Text.Json JsonSerializer.Deserialize() 将 JSON 对象转换为 C# 类,但它抛出了 JsonException。我相信原因是因为它试图转换为枚举的字符串值包含破折号(连字符)。枚举看起来像这样:

    [JsonConverter(typeof(JsonStringEnumConverter))]
    public enum TypeEnum
    {
        [EnumMember(Value = "loopback")]
        Loopback = 1,

        [EnumMember(Value = "link-local")]
        LinkLocal = 2,
    }

JSON 对象很大,但导致异常的部分是这样的:

{
    "address": "fe80::3617:ebff:fec0:b54c/64"
    "family": "inet6",
    "type": "link-local"
}

当 JsonSerializer 遇到 "type":"link-local" 时,它不喜欢 "link-local" 并抛出。有没有办法解决这个问题?

谢谢。

被问到例外所以​​这里是:

 System.Text.Json.JsonException : The JSON value could not be converted to DmIfInfoAddr+TypeEnum. Path: $[0].addrs[0].type | LineNumber: 0 | BytePositionInLine: 144.
  Stack Trace: 
    ThrowHelper.ThrowJsonException(String message)
    EnumConverter`1.ReadWithQuotes(Utf8JsonReader& reader)
    EnumConverter`1.Read(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options)
    JsonPropertyInfo`1.ReadJsonAndSetMember(Object obj, ReadStack& state, Utf8JsonReader& reader)
    ObjectDefaultConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
    JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
    IEnumerableDefaultConverter`2.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, TCollection& value)
    JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
    JsonPropertyInfo`1.ReadJsonAndSetMember(Object obj, ReadStack& state, Utf8JsonReader& reader)
    ObjectDefaultConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
    JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
    IEnumerableDefaultConverter`2.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, TCollection& value)
    JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
    JsonConverter`1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state)
    JsonSerializer.ReadCore[TValue](JsonConverter jsonConverter, Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state)
    JsonSerializer.ReadCore[TValue](Utf8JsonReader& reader, Type returnType, JsonSerializerOptions options)
    JsonSerializer.Deserialize[TValue](String json, Type returnType, JsonSerializerOptions options)
    JsonSerializer.Deserialize[TValue](String json, JsonSerializerOptions options)

【问题讨论】:

标签: c# .net-core system.text.json


【解决方案1】:

截至目前,System.Text.Json 不支持 System.Runtime.Serialization 属性,正如您在从 Newtonsoft.Json guide 迁移中看到的那样。 github 上有一个问题,您可以跟踪该问题。作为解决方法,您可以尝试使用来自Macross.Json.ExtensionsJsonStringEnumMemberConverter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 2013-03-17
    • 2012-12-25
    • 1970-01-01
    • 2012-01-05
    • 2021-04-15
    相关资源
    最近更新 更多