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"}这是我所期望的。

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 进行序列化,否则它只使用默认序列化程序。

相关内容

  • 没有找到相关文章

最新更新