Как правильно сериализовать мой объект, содержащий список‹ключ-значение‹строка, строка››, в Json?

Я пытаюсь сериализовать коллекцию объектов с именем TableDTO. Этот объект содержит имя, дату и список>. Я пытаюсь сериализовать его с помощью библиотеки Newtonsoft.Json на С#.

Все работает хорошо, когда я создаю объект. Я добавляю KeyValuePair следующим образом:
mylist.Add(new KeyValuePair<string, string>($"Col{compteur}", value.Value));
Затем я добавляю список в свой TableDTO
TableDTO.List = mylist
Затем я сериализую свой объект следующим образом
JsonConvert.SerializeObject(TableDto);
И вот что я получил

{ "FileName" : "MEP

{
    {"Col1":"value"},
    {"Col2":"value"}
}
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, но, поскольку список является свойством моего объекта, это не так просто.

Большое спасибо за помощь


person Wafou Z    schedule 02.12.2016    source источник
comment
Не могли бы вы поделиться своим кодом? Недавно я сделал то же самое, что вы пытаетесь сделать здесь, поэтому, пожалуйста, дайте мне больше информации, чтобы я мог вам помочь.   -  person Tony_KiloPapaMikeGolf    schedule 02.12.2016
comment
Ваш желаемый JSON недействителен. Загрузите на jsonlint.com, и вы получите сообщение об ошибке Error: Parse error on line 1: { { "Col1": "value". В стандарте json контейнер, окруженный фигурными скобками { ... }, представляет собой неупорядоченный набор пар имя/значение, но ваш внешний контейнер не имеет имен свойств.   -  person dbc    schedule 02.12.2016


Ответы (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);
    }
person Tony_KiloPapaMikeGolf    schedule 02.12.2016
comment
У тебя только проблема со словарем. Мне даже пришлось сериализовать структуру. Вот почему в моем коде есть дополнительный класс AuthorizationKeyJsonConverter. Вам это не нужно, используйте только исправление для словаря. - person Tony_KiloPapaMikeGolf; 02.12.2016
comment
Удалось ли вам использовать мой код в вашем контексте? Пожалуйста, дайте мне знать. Если нет, поделитесь своим кодом, и позже сегодня я посмотрю на него. - person Tony_KiloPapaMikeGolf; 02.12.2016
comment
К сожалению, нет... Я не понимаю, как это использовать - person Wafou Z; 02.12.2016
comment
Тогда, пожалуйста, поделитесь своим кодом, если можете. (.sln) Так что позже сегодня мы можем написать это для вас. Это действительно не так сложно, когда вы понимаете, что делать. - person Tony_KiloPapaMikeGolf; 02.12.2016