gpt4 book ai didi

c# - JObject ToString 与 StringEnumConverter 不工作

转载 作者:行者123 更新时间:2023-11-30 22:56:35 26 4
gpt4 key购买 nike

我正在尝试按如下方式序列化一个匿名类:

public enum ErrorCode 
{
A,
B,
C
}

var response = JObject.FromObject(new
{
Error = new
{
Message = "Test",
Code = ErrorCode.A
}
})
.ToString(Formatting.None, new StringEnumConverter());

我希望响应是:

{"Error":{"Message":"Test","Code":"A"}}

但我得到:

{"Error":{"Message":"Test","Code":0}}

如果我将 [JsonConverter(typeof(StringEnumConverter) 属性添加到枚举中,我确实会得到正确的响应,但由于不相关的原因我无法这样做。

您可以找到示例代码 here .

我在这里遗漏了什么明显的东西吗?我的方法类似于示例 here

最佳答案

您的问题是您在此过程中应用 StringEnumConverter 的时间太晚了。当您的 POCO 序列化为 JObject 层次结构时,Json.NET 将 enum 转换为字符串或整数,但稍后您将提供转换器,当 JObject 最终格式化为字符串。

相反,在使用 JObject.FromObject(Object, JsonSerializer) 序列化为 JObject 时提供转换器并构建具有所需设置的序列化程序:

var response = JObject.FromObject(
new
{
Error = new
{
Message = "Test",
Code = ErrorCode.A
}
},
JsonSerializer.CreateDefault(new JsonSerializerSettings { Converters = { new StringEnumConverter() } })
)
.ToString(Formatting.None);

fiddle 示例 here .

(您可能会问,提供给 JToken.ToString(Formatting,JsonConverter[]) 的转换器什么时候重要?虽然,一般,转换器是在序列化到 JToken 期间应用的,但这些转换器用于控制 Newtonsoft 直接存储在 JValue.Value 中而无需修改的值类型的格式。最值得注意的是,DateTime 值直接存储在 JToken 层次结构中,在序列化期间无需转换。反过来,发生这种情况是因为 Newtonsoft 在 JsonTextReader 对 JSON 流进行标记化期间识别了 DateTime 值,因此需要能够存储生成的 DateTime 对象在 JValue 中。有关详细信息,请参阅 herehere。相反,由于 Json.NET 在解析期间不会尝试识别枚举值,因此永远不需要将它们保留在 JToken 层次结构。因此它们在序列化阶段被转换为字符串或整数。)

关于c# - JObject ToString 与 StringEnumConverter 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54341115/

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