繁体   English   中英

如何序列化字典<MyClass, string>

[英]how to serialize a dictionary <MyClass, string>

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

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

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

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

问题是我试图发送一个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);
}

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

您不能使用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);

我的解决方案非常简单,对我有用。

我的代码的主要问题是,在序列化时我没有得到对象,而是一个描述对象的字符串......所以如果它必须是一个字符串,而不是一个对象,解决方案非常简单:将对象转换为字符串首先,然后序列化字典。

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

暂无
暂无

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

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