Json.NET StringEnumConverter ne fonctionne pas comme prévu
Je suis d'essayer d'utiliser Json.NET avec le Système.Net.Http.HttpClient pour envoyer un objet avec une énumération des biens, toutefois l'enum est toujours sérialisé comme une valeur entière plutôt que de l'équivalent de chaîne.
J'ai essayé en suivant les instructions ici:
Par ajout d'une instance de StringEnumConverter à la JsonSerializerSettings et également essayé de décorer l'enum propriété avec [JsonProperty(ItemConverterType = typeof(StringEnumConverter))]
ni de ce qui semble être de travailler dans mon exemple.
Je suis en utilisant Json.NET la version 5.0.8
Quelqu'un peut me dire ce que je fais mal, s'il vous plaît? Voici un exemple d'une application de console à reproduire en montrant à la fois le mondial sérialiseur paramètres et décoré de la propriété:
Grâce.
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
}
}
}
J'ai inspecté ce avec un violon et des postes: {"Enum":0}
plutôt que {"Enum":"Hello"}
qui est ce à quoi je m'attends.
source d'informationauteur Garry Marsland
Vous devez vous connecter pour publier un commentaire.
La
ItemConverterType
propriété de laJsonPropertyAttribute
attribut est le convertisseur à utiliser pour les éléments d'une collection. Vous devriez être en utilisant laJsonConverterAttribute
attribut.Je pense que j'ai trouvé un moyen de la faire fonctionner sans décoration attributs. Il s'agit de remplacer
client.PostAsJsonAsync()
avecclient.PostAsync()
. Vous pouvez ensuite spécifier les MediaTypeFormatter à utiliser qui dans ce cas sera leJsonMediaTypeFormatter
.Source ici: .net HttpClient personnalisé JsonConverter
Cela n'explique toujours pas pourquoi le DefaultSettings ne sont pas appliquées. Je ne peux que supposer que la présence de la
[JsonConverter]
propriété forces de l'HttpClient à utiliser Json.NET pour la sérialisation, sinon il utilise juste le défaut sérialiseur.