【发布时间】:2013-11-01 16:39:30
【问题描述】:
我正在尝试将 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"},这是我所期望的。
【问题讨论】:
-
有没有可能,您的示例中根本没有使用 JsonConverter?序列化由客户端对象 - HttpClient 进行。我尝试使用 JsonConvert.SerializeObject(data) 序列化数据对象,输出正确:{"Enum":"Hello"}。所以我认为 HttpClient 不会将枚举转换为字符串。
-
你很可能是对的。我的印象是 HttpClient 现在在后台使用 Json.NET。也许我错了。我会找个修补匠,看看能找到什么。
-
它似乎在后台使用 Json.NET - 请参阅下面 Jeff 的回答。
-
好吧,我不知道。
标签: c# json serialization json.net