gpt4 book ai didi

c# - 如何使 JSON.NET StringEnumConverter 使用连字符分隔的大小写

转载 作者:IT老高 更新时间:2023-10-28 12:48:37 26 4
gpt4 key购买 nike

我使用一个返回字符串值的 API,如下所示:

some-enum-value

我尝试将这些值放在 enum 中,因为默认的 StringEnumConverter 没有做我想要的,即用一些额外的逻辑来装饰这个 Converter .

我如何确保这些值被正确反序列化

以下代码是我完成这项工作的尝试。
然而这条线

reader = new JsonTextReader(new StringReader(cleaned));

由于 base.ReadJson 无法将字符串识别为 JSON,因此破坏了整个过程。

有没有更好的方法来做到这一点,而不必在 StringEnumConverter 中实现所有现有的逻辑?
我该如何修正我的方法?

public class BkStringEnumConverter : StringEnumConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.String)
{
var enumString = reader.Value.ToString();
if (enumString.Contains("-"))
{
var cleaned = enumString.Split('-').Select(FirstToUpper).Aggregate((a, b) => a + b);
reader = new JsonTextReader(new StringReader(cleaned));
}
}
return base.ReadJson(reader, objectType, existingValue, serializer);
}

private static string FirstToUpper(string input)
{
var firstLetter = input.ToCharArray().First().ToString().ToUpper();
return string.IsNullOrEmpty(input)
? input
: firstLetter + string.Join("", input.ToCharArray().Skip(1));
}
}

最佳答案

我通过在我的枚举值上添加 EnumMember 属性解决了这个问题。 Json.NET 默认的 StringEnumConverter 完美地处理了这些属性。

例子:

public enum MyEnum
{
[EnumMember(Value = "some-enum-value")]
SomeEnumValue,
Value,
[EnumMember(Value = "some-other-value")]
SomeOtherValue
}

请注意,您只需要在破折号或其他无法在枚举中使用的特殊字符的情况下指定属性。 StringEnumConverter 处理大写小写。因此,如果服务返回类似 someenumvalue 的值,您应该在枚举 Someenumvalue 中像这样使用它。如果你更喜欢 SomeEnumValue 你应该使用 EnumMember 属性。如果服务像这样返回它 someEnumValue 您可以像这样使用它 SomeEnumValue (当您使用 CamelCaseText 属性时,它开箱即用)。

您可以在 JsonSerializerSettings 中轻松指定转换器和其他设置。

这是我自己使用的设置示例。

new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
Converters = new List<JsonConverter> { new StringEnumConverter { CamelCaseText = true } },
NullValueHandling = NullValueHandling.Ignore
};

关于c# - 如何使 JSON.NET StringEnumConverter 使用连字符分隔的大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22908204/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com