使用C#.NET Core反序列化json

时间:2018-01-03 10:22:10

标签: c# json serialization .net-core datacontractjsonserializer

我试图反序列化我已经通过JSON格式发布的数据,但遇到了一些问题。

错误消息是:

  

SerializationException:期望状态'Element'..遇到名为'',namespace''的'Text'。   System.Runtime.Serialization.XmlObjectSerializerReadContext.HandleMemberNotFound(XmlReaderDelegator xmlReader,ExtensionDataObject extensionData,int memberIndex)

序列化发生的控制器:

    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:

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; }
    }
}

我发送的一个JSON示例:

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

1 个答案:

答案 0 :(得分:6)

切换到JSON.Net。

JSON序列化API不是.Net核心的一部分,我不希望他们将其移植到那里。如果您使用来自System.Web.Script.Serialization等名称空间的类切换到其他序列化,特别是基于.Net核心的Microsfot框架使用JSON.Net序列化程序。

正如许多用户在评论中所提到的,我已经从旧的使用契约进行序列化/反序列化转换为JSON.NET

这是控制器的正确解决方案

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