【问题标题】:Deserialize json with C# .NET Core使用 C# .NET Core 反序列化 json
【发布时间】:2018-06-13 00:19:32
【问题描述】:

我正在尝试以 JSON 格式反序列化通过 POST 获得的数据,但遇到了一些问题。

错误信息是:

SerializationException:期待状态“元素”。遇到名称为“”、命名空间“”的“文本”。 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"}

【问题讨论】:

  • "System.Runtime.Serialization.Xml"... 在错误中。唔。检查您的默认序列化程序。
  • 为什么要使用已弃用的 DataContractJsonSerializer? .NET 本身在 ASP.NET Web API 中使用 JSON.NET。 .NET Core 在 ASP.NET MVC 和 Web API 中都使用 Json.NET。通过使用 DataContractJsonSerializer 您正在引入对遗留类的依赖
  • 我也注意到了这个,但我对 .NET 完全陌生。你能详细说明一下默认的序列化程序吗?
  • @MichalTakáč 忘记默认序列化程序并使用 JSON.NET。一个简单的 JSonConvert.DeserializeObject(userData)` 就足够了
  • 我刚刚切换到 JSON.NET,它运行良好。谢谢你的帮助:)

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


【解决方案1】:

切换到 JSON.Net。

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

正如许多 cmets 用户所提到的,我已经从使用合同进行序列化/反序列化的旧方式切换到 JSON.NET

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

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

【讨论】:

  • $ dotnet 添加包 Microsoft.AspNetCore.Mvc.NewtonsoftJson
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2021-03-31
  • 2021-02-03
  • 2023-03-12
  • 2020-03-13
  • 1970-01-01
  • 2020-06-30
相关资源
最近更新 更多