c# - Json.NET StringEnumConverter no funciona como se esperaba
serialization (2)
Estoy intentando usar Json.NET con System.Net.Http.HttpClient para enviar un objeto con una propiedad enum, sin embargo, la enumeración siempre se serializa como un valor entero en lugar de la cadena equivalente.
He intentado seguir las instrucciones aquí:
Al agregar una instancia de StringEnumConverter a JsonSerializerSettings y también se intentó decorar la propiedad enum con [JsonProperty(ItemConverterType = typeof(StringEnumConverter))]
ninguno de los cuales parece estar funcionando en mi ejemplo.
Estoy usando la versión 5.0.8 de Json.NET
¿Alguien puede decirme que estoy haciendo mal por favor? Aquí hay una aplicación de consola de muestra para replicar mostrando tanto la configuración global del serializador como la propiedad decorada:
Gracias.
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
}
}
}
He inspeccionado esto con Fiddler y publica: {"Enum":0}
lugar de {"Enum":"Hello"}
que es lo que esperaría.
Creo que he encontrado una manera de hacer que funcione sin decorar atributos. Implica reemplazar client.PostAsJsonAsync()
con client.PostAsync()
. Luego, puede especificar el MediaTypeFormatter para usar, que en este caso será el JsonMediaTypeFormatter
.
Fuente aquí: .net HttpClient con JsonConverter personalizado
var settings = new JsonSerializerSettings();
settings.Converters.Add(new StringEnumConverter());
var formatter = new JsonMediaTypeFormatter { SerializerSettings = settings };
var response = client.PostAsync("/test", data, formatter).Result;
Esto todavía no explica por qué no se están aplicando los ajustes predeterminados. Solo puedo asumir que la presencia de la propiedad [JsonConverter]
obliga a HttpClient a usar Json.NET para la serialización, de lo contrario, solo usa el serializador predeterminado.
La propiedad JsonPropertyAttribute
atributo JsonPropertyAttribute
es el convertidor que se utiliza para los elementos de una colección. Debería estar utilizando el atributo JsonConverterAttribute
.
public class TestData
{
[JsonConverter(typeof(StringEnumConverter))]
public TestEnum Enum { get; set; }
}