我正在尝试将Json.NET与System.Net.Http.HttpClient一起使用以发送具有枚举属性的对象,但是枚举始终被序列化为整数值而不是等效字符串。
我已尝试按照此处的说明操作:
通过将一个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"}
这是我所期望的。
答案 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进行序列化,否则它只使用默认的序列化器。