【问题标题】:csharp JsonSerializer in System.Text.Json cannot handle certain characters with StringEnumConverter [duplicate]System.Text.Json 中的 csharp JsonSerializer 无法使用 StringEnumConverter 处理某些字符 [重复]
【发布时间】:2022-01-06 07:22:15
【问题描述】:

在 dotnet 6 上,System.Text.Json JsonSerializer 无法解析以“

https://dotnetfiddle.net/O3MdPn

过于简化,

using System;
using System.Runtime.Serialization;
using System.Text.Json;
using System.Text.Json.Serialization;

public class Program {
    public enum Operator {
        [EnumMember(Value = "<=")] LessOrEqual,
        [EnumMember(Value = "lesseq")] LessEq,
    }

    public class BasicJson { 
            public Operator Operator {get; init;}
    }

    public static void Main() {
        JsonSerializerOptions SerializationOptions = new() {
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
        IgnoreNullValues = true,
        Converters = {
                new JsonStringEnumConverter()
            },

    };
        var serialized = JsonSerializer.Deserialize<BasicJson>("{\"operator\": \"<=\"}", SerializationOptions);
        Console.Write($"{serialized.Operator}");

    }

}

导致以下错误

Unhandled exception. System.Text.Json.JsonException: The JSON value could not be converted to Program+Operator. Path: $.operator | LineNumber: 0 | BytePositionInLine: 17.
   at System.Text.Json.ThrowHelper.ThrowJsonException(String message)
   at System.Text.Json.Serialization.Converters.EnumConverter`1.ReadAsPropertyNameCore(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options)
   at System.Text.Json.Serialization.Converters.EnumConverter`1.Read(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options)
   at System.Text.Json.Serialization.Metadata.JsonPropertyInfo`1.ReadJsonAndSetMember(Object obj, ReadStack& state, Utf8JsonReader& reader)
   at System.Text.Json.Serialization.Converters.ObjectDefaultConverter`1.OnTryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
   at System.Text.Json.Serialization.JsonConverter`1.TryRead(Utf8JsonReader& reader, Type typeToConvert, JsonSerializerOptions options, ReadStack& state, T& value)
   at System.Text.Json.Serialization.JsonConverter`1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state)
   at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan`1 utf8Json, JsonTypeInfo jsonTypeInfo, Nullable`1 actualByteCount)
   at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan`1 json, JsonTypeInfo jsonTypeInfo)
   at System.Text.Json.JsonSerializer.Deserialize[TValue](String json, JsonSerializerOptions options)
   at Program.Main()

将“

编辑:

似乎 System.Text.Json 根本不尊重 EnumMember 属性,它实际上与特殊字符没有任何关系,只是序列化程序只能解析枚举名称的完全匹配(或驼峰大小写)如果您将其指定为命名策略,则匹配)。

一种解决方法是使用 Macross.Extensions.Json 包:https://www.nuget.org/packages/Macross.Json.Extensions/

然后添加

    Converters = {
                new  Macross.Json.Extensions.JsonStringEnumMemberConverter(),
                new JsonStringEnumConverter()
            },

致转换器。这会根据枚举的 EnumMember 值属性正确解析枚举。

【问题讨论】:

  • System.Text.Json 无法正确处理大多数字符。尝试使用 Newtonsoft.Json。
  • 你应该添加这个作为答案。

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


【解决方案1】:

添加到原帖,但这里是解决方案:

似乎 System.Text.Json 根本不尊重 EnumMember 属性,它实际上与特殊字符没有任何关系,只是序列化程序只能解析枚举名称的完全匹配(或驼峰大小写)如果您将其指定为命名策略,则匹配)。

一种解决方法是使用 Macross.Extensions.Json 包:https://www.nuget.org/packages/Macross.Json.Extensions/

然后添加

Converters = {
            new  Macross.Json.Extensions.JsonStringEnumMemberConverter(),
            new JsonStringEnumConverter()
        },

致转换器。这会根据枚举的 EnumMember Value 属性正确解析枚举。

【讨论】:

    猜你喜欢
    • 2016-04-17
    • 1970-01-01
    • 2018-04-18
    • 2017-07-31
    • 2018-12-21
    • 2022-12-14
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    相关资源
    最近更新 更多