【发布时间】: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)
【问题讨论】:
-
有什么例外?
-
我已将其添加到帖子中。
-
在对运行时 repo 中的
EnumConverter进行粗略审查后,它似乎并不尊重EnumMemberAttribute(从技术上讲,它不是 System.Text.Json 的一部分)。我建议编写一个自定义转换器。
标签: c# .net-core system.text.json