web-dev-qa-db-ja.com

C#.NET Coreでjsonをデシリアライズする

Iveが取得したデータをデシリアライズしようとしていますPOST JSON形式)が、問題があります。

エラーメッセージは次のとおりです。

SerializationException:Expecting state 'Element' .. Encountered 'Text' with name ''、namespace ''。 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 protected]"}
7
Michal Takáč

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);
}
11
Michal Takáč