我正在尝试序列化一个匿名类,如下所示:
public enum ErrorCode
{
A,
B,
C
}
var response = JObject.FromObject(new
{
Error = new
{
Message = "Test",
Code = ErrorCode.A
}
})
.ToString(Formatting.None, new StringEnumConverter());
我预计response
to be:
{“错误”:{“消息”:“测试”,“代码”:“A”}}
但我得到:
{“错误”:{“消息”:“测试”,“代码”:0}}
如果我添加,我确实会得到正确的响应[JsonConverter(typeof(StringEnumConverter)
属性为枚举,但由于不相关的原因我不能这样做。
您可以找到示例代码here https://rextester.com/EIGRHX86120.
我在这里遗漏了一些明显的东西吗?我的方法与示例类似here https://www.newtonsoft.com/json/help/html/ToStringJsonConverter.htm
你的问题是你正在申请StringEnumConverter
在此过程中为时已晚。 Json.NET 转换enum
当您的 POCO 序列化为字符串或整数时JObject
层次结构,但您稍后提供转换器,当JObject
最终格式化为字符串。
相反,在序列化时提供转换器JObject
通过使用JObject.FromObject(Object, JsonSerializer) https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JObject_FromObject_1.htm并使用所需的设置构建序列化器:
var response = JObject.FromObject(
new
{
Error = new
{
Message = "Test",
Code = ErrorCode.A
}
},
JsonSerializer.CreateDefault(new JsonSerializerSettings { Converters = { new StringEnumConverter() } })
)
.ToString(Formatting.None);
小提琴样本here https://dotnetfiddle.net/Y088XO.
(您可能会合理地问,转换器何时提供给JToken.ToString(Formatting,JsonConverter[]) https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JToken_ToString_1.htm有关系吗?尽管,一般来说,在序列化期间应用转换器JToken
,这些转换器对于控制 Newtonsoft 直接存储在其中的值类型的格式很有用JValue.Value https://www.newtonsoft.com/json/help/html/JValueValue.htm无需修改。最为显着地,DateTime
值直接存储在JToken
序列化期间无需转换的层次结构。反过来,这是因为 Newtonsoft 认识到DateTime
JSON 流标记化期间的值JsonTextReader
,需要能够存储结果DateTime
a 内的物体JValue
。详情请参阅here https://www.newtonsoft.com/json/help/html/DatesInJSON and here https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_DateParseHandling.htm。相反,由于 Json.NET 在解析过程中不会尝试识别枚举值,因此不需要将它们保留在JToken
等级制度。因此,它们在序列化阶段被转换为字符串或整数。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)