JObject ToString with StringEnumConverter 不起作用



我正在尝试序列化一个匿名类,如下所示:

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

我希望response是:

{">

错误":{"消息":"测试","代码":"A"}}

但我得到:

{"错误":

{"消息":"测试","代码":0}}

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

您可以在此处找到示例代码。

我在这里错过了一些明显的东西吗?我的方法类似于这里的例子

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

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

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

在这里品尝小提琴。

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

相关内容

  • 没有找到相关文章

最新更新