首页 > 解决方案 > JsonConverter 不会用破折号(连字符)转换枚举

问题描述

我正在尝试使用 .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-coresystem.text.json

解决方案


到目前为止,正如您在从guide迁移中看到的那样,不System.Text.Json支持属性。github上有一个问题,您可以跟踪。作为解决方法,您可以尝试使用from 。System.Runtime.SerializationNewtonsoft.Json JsonStringEnumMemberConverterMacross.Json.Extensions


推荐阅读