我试图序列化一个名为TableDTO的对象集合。该对象包含名称,日期和列表>。 我正在尝试使用C#
中的Newtonsoft.Json库对其进行序列化构建对象时,每件事情都很有效。我像这样添加KeyValuePair:
mylist.Add(new KeyValuePair<string, string>($"Col{compteur}", value.Value));
然后我将列表添加到我的TableDTO中 TableDTO.List = mylist
然后我像这样序列化我的对象
的 JsonConvert.SerializeObject(TableDto);
这就是我所得到的
{
"FileName" : "MEP_3_10$3aList.xlsx",
"Conditions" :{"Predicate" : "<select a condition>"},
"DataRows" :
[{"Key" : "Col1","Value" : "value"},
{"Key" : "Col2","Value" : "value"}]
}
我遇到的问题是我序列化的时候 而不是
{
{"Col1":"value"},
{"Col2":"value"}
}
列表像这样序列化
{
{"Key" : "Col1","Value" : "value"},
{"Key" : "Col2","Value" : "value"}
}
我尝试使用stackoverflow中另一篇文章中描述的转换器,但由于列表是我的对象的属性,它并不那么容易。
非常感谢您的帮助
答案 0 :(得分:1)
您遇到的问题是: NewtonSoft JSON无法处理字典键值和结构。
请检查我的代码:
public class CustomJSONSerializationHelper
{
public string CustomSerialize(Dictionary<AuthorizationKey, ConditionalActionFlags> actionFlagMappings)
{
// ToArray() and use custom convertors, because NewtonSoft JSON can't handle dictionary key values and struct.
var jsonString = JsonConvert.SerializeObject(actionFlagMappings.ToArray(), new Newtonsoft.Json.Converters.StringEnumConverter(), new AuthorizationKeyJsonConverter());
return jsonString;
}
public Dictionary<AuthorizationKey, ConditionalActionFlags> CustomDeserialize(string jsonActionFlagMappings)
{
var resultArray = CustomDeserializeOverLoad(jsonActionFlagMappings);
return (resultArray != null) ? resultArray.ToList().ToDictionary(pair => pair.Key, pair => pair.Value) : null;
}
public KeyValuePair<AuthorizationKey, ConditionalActionFlags>[] CustomDeserializeOverLoad(string jsonActionFlagMappings)
{
var result = JsonConvert.DeserializeObject<KeyValuePair<AuthorizationKey, ConditionalActionFlags>[]>(jsonActionFlagMappings,
new Newtonsoft.Json.Converters.StringEnumConverter(), new AuthorizationKeyJsonConverter());
return result;
}
}
我称之为:
private string ObjectToJSON(Dictionary<AuthorizationKey, ConditionalActionFlags> actionFlagsMapping)
{
CustomJSONSerializationHelper customSerializationHelper = new CustomJSONSerializationHelper();
return customSerializationHelper.CustomSerialize(actionFlagsMapping);
}