如何正确序列化包含列表的对象<keyvaluepair <string,string>&gt;进入Json?

时间:2016-12-02 08:22:52

标签: c# json serialization keyvaluepair

我试图序列化一个名为TableDTO的对象集合。该对象包含名称,日期和列表&gt;。 我正在尝试使用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中另一篇文章中描述的转换器,但由于列表是我的对象的属性,它并不那么容易。

非常感谢您的帮助

1 个答案:

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