我正尝试序列化一个匿名类,如下所示:
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)
属性添加到枚举,我确实会得到正确的响应,但是由于不相关的原因,我无法做到这一点。
您可以找到示例代码here。
我在这里缺少明显的东西吗?我的方法类似于示例here
答案 0 :(得分:2)
您的问题是您在申请StringEnumConverter
的过程中太晚了。当您将POCO序列化为enum
层次结构时,Json.NET将JObject
转换为字符串或整数,但是当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);
提琴here。
(您可能会合理地问,提供给JToken.ToString(Formatting,JsonConverter[])
的转换器何时会变得无关紧要?通常,转换器在序列化到JToken
的过程中被应用,这些转换器是有助于控制Newtonsoft直接存储在JValue.Value
内而无需修改的值类型的格式。最值得注意的是,DateTime
值直接存储在JToken
层次结构中,而无需在序列化过程中进行转换。发生这种情况是因为Newtonsoft在DateTime
标记JSON流的过程中识别了JsonTextReader
的值,因此必须能够将结果DateTime
对象存储在JValue
中。有关详细信息,请参见{{3 }}和here。相反,由于Json.NET不会在解析过程中识别枚举值,因此不再需要将它们保留在JToken
层次结构中,因此可以将它们转换为字符串或序列化阶段的整数。)