我试图将 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"}
这是我所期望的。
JsonPropertyAttribute
属性的 ItemConverterType
属性是用于集合项的转换器。 您应该使用 JsonConverterAttribute
属性。
public class TestData
{
[JsonConverter(typeof(StringEnumConverter))]
public TestEnum Enum { get; set; }
}
我想我已经找到了一种在不装饰属性的情况下让它工作的方法。 它涉及用client.PostAsync()
替换client.PostAsJsonAsync()
。 然后,您可以指定要使用的媒体类型格式化程序,在本例中为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;
这仍然不能解释为什么没有应用默认设置。 我只能假设 [JsonConverter]
属性的存在强制 HttpClient 使用 Json.NET 进行序列化,否则它只使用默认序列化程序。