2

Newtonsoft.Jsonをバージョン4.0.8で使用していて、WebAPIで使用しようとしています。だから私はJSONをデシリアライズしたかった

JsonConvert.DeserializeObject<AClass>(jsonString);

これは、このクラスにプロパティとしてディクショナリを追加し、それを逆シリアル化するまで機能します。

json文字列は次の形式です

{ 
   "Date":null,
   "AString":"message",
   "Attributes":[
                   {"Key":"key1","Value":"value1"},      
                   {"Key":"key2","Value":"value2"}
                ],
    "Id":0,
    "Description":"...
}

タイプの逆シリアル化例外が次のJsonSerializationExceptionメッセージで発生した場合:「JSON配列をタイプ'System.Collections.Generic.Dictionary`2 [System.String、System.String]'に逆シリアル化できません。

私はここで何が間違っているのですか?

UPDATE1:JSON.NET でシリアル化すると、辞書として次のようになります。

Attributes":{"key1":"value1","key2":"value2"}

WebApiはJson.Netとは別の方法でオブジェクトを逆シリアル化するようです。サーバー側私は暗黙の逆シリアル化のために次の行を使用します:

return new HttpResponseMessage<AClass>(object);

UPDATE2: 回避策として、次の回線サーバー側に移動しました。

return new HttpResponseMessage<string>(JsonConvert.SerializeObject(license).Base64Encode());

Json.Netサーバー側で変換し、base64でエンコードされた文字列として転送します。したがって、Json.Netは独自の形式を逆シリアル化できます。

しかし、それでも私が望んでいることではないので、それ以上の提案はありますか?

4

4 に答える 4

3

次のように宣言すると機能するはずAttributesです List<KeyValuePair<string, string>>

于 2012-05-14T14:57:54.500 に答える
1

この投稿から、

JsonConvert.SerializeObject(yourObject, new KeyValuePairConverter());

WebAPIが作成する形式でJSONを取得します。

エルゴ、

JsonConvert.DeserializeObject<AClass>(jsonString, new KeyValuePairConverter());

逆のことを行い、WebAPIのスタイルを正しく処理します。

ただし、この過負荷が存在するかどうかはわかりません。試してみて、何が起こるか見てみましょう...

于 2012-05-14T15:13:23.013 に答える
1
Dictionary<string, object> result = JsonConvert.DeserializeObject<Dictionary<string, object>>(strJsonResult);
于 2013-11-01T20:21:19.643 に答える
0

.NET 4の場合は、DataContract属性とDataContractJsonSerializerクラスを使用して、メッセージ形式を適用できます。

    [DataContract]
    public class Message
    {
        [DataMember]
        public DateTime? Date { get; set; }
        [DataMember]
        public string AString { get; set; }
        [DataMember]
        public Dictionary<string, string> Attributes { get; set; }
        [DataMember]
        public int Id { get; set; }
        [DataMember]
        public string Description { get; set; }
    }

        DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(Message));

        Message message = null;
        using (MemoryStream jsonStream = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
        {
            // Deserialize
            message = (Message)jsonSerializer.ReadObject(jsonStream);

            // Go to the beginning and discard the current stream contents.
            jsonStream.Seek(0, SeekOrigin.Begin);
            jsonStream.SetLength(0);

            // Serialize
            jsonSerializer.WriteObject(jsonStream, message);
            jsonString = Encoding.UTF8.GetString(jsonStream.ToArray());
        }

このバックアウトをシリアル化すると、次のJSONが生成されます。

{"AString":"message","Attributes":[{"Key":"key1","Value":"value1"},{"Key":"key2","Value":"value2"}],"Date":null,"Description":"...","Id":0}
于 2012-05-14T17:35:13.980 に答える