我正在尝试序列化一个匿名类,如下所示:
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
层次结构中。 因此,它们在序列化阶段转换为字符串或整数。