带有StringEnumConverter的JObject ToString不起作用

时间:2019-01-24 07:09:30

标签: c# json.net

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

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

1 个答案:

答案 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层次结构中,因此可以将它们转换为字符串或序列化阶段的整数。)