19

我正在尝试将 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 并尝试装饰 enum 属性,[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"}我所期望的。

4

2 回答 2

23

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

public class TestData
{
    [JsonConverter(typeof(StringEnumConverter))]
    public TestEnum Enum { get; set; }
}
于 2013-11-01T16:56:45.710 回答
9

我想我已经找到了一种无需装饰属性就能让它工作的方法。它涉及替换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 进行序列化,否则它只使用默认的序列化程序。

于 2013-11-01T18:17:20.997 回答