使用 JSON.NET 反序列化字典



我正在使用4.0.8版本的Newtonsoft.Json,并尝试将其与Web API一起使用。所以我想用 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 可以反序列化自己的格式。

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

如果您将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}

相关内容

  • 没有找到相关文章