,c#,json,dictionary,serialization"/>

首页 > 解决方案 > 如何序列化字典

问题描述

我有一个我建立的类,所以我可以控制它。我的问题如下:

我正在尝试发送一个 http 请求(放置),其中包含一些内容。

var dictJson = Newtonsoft.Json.JsonConvert.SerializeObject(dictionary, Formatting.Indented);

var test = await _httpClient.PutAsync($"myurl", new StringContent(dictJson, Encoding.UTF8, "application/json"));

问题是我正在尝试发送 a Dictionary<MyClass, string>,所以我很好地通过了字典,但问题在于序列化。然后在序列化之后,我得到了正确的值,但不是对象,而是类的名称,所以改为“MyClass”。

我曾尝试直接序列化字典但没有成功,我还尝试了以下方法:

var dictionary = new Dictionary<string, string>();
foreach(var kvp in dict)
{
    var t = kvp.Key.ToString();
    dictionary.Add(kvp.Key.ToString(), kvp.Value);
}

仍然得到相同的结果,有什么建议吗?

标签: c#jsondictionaryserialization

解决方案


您不能MyObject在 JSON 中用作键。来自Newtonsoft 序列化指南

序列化字典时,字典的键被转换为字符串并用作 JSON 对象属性名称。可以通过重写键类型的 ToString() 或实现 TypeConverter 来自定义为键编写的字符串。TypeConverter 还将支持在反序列化字典时再次将自定义字符串转换回来。

而不是您可以像这样以 JSON 结构传输您的字典:[{ Key: 'your key from a dictionary', Value = 'your value from a dictionary'}]

简单的实现:

    class SimpleKeyValue<TK, TValue>
    {
        public TK Key { get; set; }
        public TValue Value { get; set; }
    }

    Dictionary<MyClass, int> dict = new Dictionary<MyClass, int>{
        {new MyClass() {Id = 1}, 1},
        {new MyClass() {Id = 2}, 2},
        {new MyClass() {Id = 3}, 3},
        {new MyClass() {Id = 4}, 4}
    };

    var simpleKeyValues = dict.Select(item => new SimpleKeyValue<MyClass, int>
    {
        Key = item.Key,
        Value = item.Value
    });

    var json = JsonConvert.SerializeObject(simpleKeyValues);

    var result = JsonConvert.DeserializeObject<IEnumerable<SimpleKeyValue<MyClass, int>>>(json)
        .ToDictionary(item => item.Key, item => item.Value);

推荐阅读