繁体   English   中英

使用JSON.NET反序列化字典

[英]Deserialize Dictionary with JSON.NET

我在版本4.0.8中使用Newtonsoft.Json,并尝试将其与Web API一起使用。 所以我想用反序列化JSON

JsonConvert.DeserializeObject<AClass>(jsonString);

在我将Dictionary作为属性添加到此类并想反序列化之前,此方法一直有效。

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可以反序列化其自己的格式。

但是它仍然不是我想要的,理论上有什么进一步的建议吗?

如果您将Attributes声明为List<KeyValuePair<string, string>>它应该可以工作

这篇文章中

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

以Web API为您创建的格式获取JSON。

因此,有人可能会认为

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

将进行相反操作并正确处理Web API的样式。

我不知道这种重载是否存在。 试试看,看看会发生什么...

Dictionary<string, object> result = JsonConvert.DeserializeObject<Dictionary<string, object>>(strJsonResult);

如果是.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}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM