web-dev-qa-db-fra.com

Désérialiser json avec C # .NET Core

Im essayant de désérialiser les données que j'ai surmontées POST au format JSON mais ayant un problème.

Le message d'erreur est:

SerializationException: état attendu 'Élément' .. 'Texte' rencontré avec le nom '', espace de noms ''. System.Runtime.Serialization.XmlObjectSerializerReadContext.HandleMemberNotFound (XmlReaderDelegator xmlReader, ExtensionDataObject extensionData, int memberIndex)

Contrôleur où se produit la sérialisation:

    public String RequestToken(string userData)
    {
            Contract.Ensures(Contract.Result<string>() != null);
            UserModel deserializedUser = new UserModel();
            MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(userData));
            ms.Position = 0;
            DataContractJsonSerializer ser = new DataContractJsonSerializer(deserializedUser.GetType());
            deserializedUser = ser.ReadObject(ms) as UserModel;
    }

UserModel utilisé comme contrat:

using System;
using System.Runtime.Serialization;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;

namespace WishareIntegrationApi.Entities
{
    [DataContract]
    public class UserModel
    {
        [BsonId]
        [BsonRepresentation(BsonType.String)]
        [DataMember]
        public ObjectId _id { get; set; }
        [DataMember]
        public string displayName { get; set; }
        [DataMember]
        public string photoURL { get; set; }
        [DataMember]
        public string email { get; set; }
        [DataMember]
        public int registeredAt { get; set; }
    }
}

Et un exemple JSON que j'envoie par la poste:

{"_id":"8kmXH1fzSrVS8PqNLMwyhRH4hBw1","displayName":"Michal Takáč","photoURL":"https://lh3.googleusercontent.com/-xa5oE48RffQ/AAAAAAAAAAI/AAAAAAAACDE/OLrtV5-VIvw/photo.jpg","email":"[email protected]"}
7
Michal Takáč

Basculez vers JSON.Net.

Les API de sérialisation JSON ne font pas partie du noyau .Net et je ne m'attends pas à ce qu'elles le portent. Si vous avez utilisé des classes d'espaces de noms comme System.Web.Script.Serialization passer à une autre sérialisation, en particulier les frameworks Microsfot basés sur le noyau .Net utilisent des sérialiseurs JSON.Net.

Comme mentionné par de nombreux utilisateurs dans les commentaires, je suis passé de l'ancienne méthode de sérialisation/désérialisation à l'aide de contrats à JSON.NET

Voici la bonne solution pour le contrôleur

public async Task<String> RequestToken(string userData)
{
     var user = JsonConvert.DeserializeObject<UserModel>(userData);
}
11
Michal Takáč