2

我正在使用带有 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 可以反序列化自己的格式。

但它仍然不是我想要的,所以他们有什么进一步的建议吗?

4

4 回答 4

3

如果您声明AttributesList<KeyValuePair<string, string>>

于 2012-05-14T14:57:54.500 回答
1

这个帖子,打电话

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

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

因此,人们可能会认为调用

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

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

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

于 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 回答