Json.NET StringEnumConverter无法按预期工作

我正在尝试使用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"}这就是我所期望的。

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

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

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

来源: .net HttpClient与自定义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进行序列化,否则它只使用默认的序列化程序。