Json.NET StringEnumConverter无法按预期工作

时间:2013-11-01 16:39:31

标签: c# json serialization json.net

我正在尝试将Json.NET与System.Net.Http.HttpClient一起使用以发送具有枚举属性的对象,但是枚举始终被序列化为整数值而不是等效字符串。

我已尝试按照此处的说明操作:

http://james.newtonking.com/archive/2013/05/08/json-net-5-0-release-5-defaultsettings-and-extension-data

通过将一个StringEnumConverter实例添加到JsonSerializerSettings并尝试使用[JsonProperty(ItemConverterType = typeof(StringEnumConverter))]来装饰枚举属性,这两个属性似乎都不适用于我的示例。

我正在使用Json.NET版本5.0.8

有人可以告诉我,我做错了吗?以下是要复制的示例控制台应用程序,同时显示全局序列化程序设置和修饰属性:

感谢。

using System;
using System.Net.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            HttpClient client = new HttpClient { BaseAddress = new Uri("http://test-uri.com") };

            JsonConvert.DefaultSettings = (() =>
            {
                var settings = new JsonSerializerSettings();
                settings.Converters.Add(new StringEnumConverter());
                return settings;
            });

            var data = new TestData { Enum = TestEnum.Hello };

            // The following posts: {"Enum":0}
            // Shouldn't it post {"Enum":"Hello"} instead?
            var result = client.PostAsJsonAsync("/test", data).Result;
        }

        public class TestData
        {
            [JsonProperty(ItemConverterType = typeof(StringEnumConverter))]
            public TestEnum Enum { get; set; }
        }

        public enum TestEnum
        {
            Hello,
            World
        }
    }
}

我已经与Fiddler一起检查了这一点,并发布了{"Enum":0}而不是{"Enum":"Hello"}这是我所期望的。

2 个答案:

答案 0 :(得分:23)

ItemConverterType属性的JsonPropertyAttribute属性是用于集合项目的转换器。您应该使用JsonConverterAttribute属性。

public class TestData
{
    [JsonConverter(typeof(StringEnumConverter))]
    public TestEnum Enum { get; set; }
}

答案 1 :(得分:9)

我认为我找到了一种在不修饰属性的情况下让它工作的方法。它涉及将client.PostAsJsonAsync()替换为client.PostAsync()。然后,您可以指定要使用的MediaTypeFormatter,在这种情况下将是JsonMediaTypeFormatter

来源:.net HttpClient with custom JsonConverter

    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new StringEnumConverter());
    var formatter = new JsonMediaTypeFormatter { SerializerSettings = settings };
    var response = client.PostAsync("/test", data, formatter).Result;

这仍然无法解释为什么没有应用DefaultSettings。我只能假设[JsonConverter]属性的存在迫使HttpClient使用Json.NET进行序列化,否则它只使用默认的序列化器。