如何序列化字典<MyClass,字符串>



我已经构建了一个类,所以我可以控制它。我的问题如下:

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

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);
}

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

不能在JSON中使用MyObject作为键。来自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);

最新更新