2016-12-02 3 views
1

Я пытаюсь сериализовать коллекцию объектов с именем TableDTO. Этот объект содержит имя, дату и список>. Я пытаюсь сериализовать его, используя библиотеку Newtonsoft.Json в C#Как правильно сериализовать мой объект, содержащий список <keyvaluepair <string, string >> в 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, но si nce список является свойством моего объекта, это не так просто.

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

+2

Можете ли вы поделиться больше вашего кода? Недавно я сделал то же самое, что вы пытаетесь сделать здесь, поэтому, пожалуйста, дайте мне больше информации, чтобы я мог вам помочь. –

+0

Ваш желаемый JSON недействителен. Загрузите на http://jsonlint.com/, и вы получите сообщение об ошибке 'Error: Parse error в строке 1: {\t {\t \t" Col1 ":" value "'. В стандарте [json standard] (http://www.json.org/) контейнер, окруженный фигурными скобками, '{...}' является неупорядоченным набором пар имя/значение, но ваш внешний контейнер не имеет имен свойств. – dbc

ответ

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

У вас проблема со словарем. Мне даже пришлось сериализовать структуру. Вот почему мой код имеет дополнительный класс AuthorizationKeyJsonConverter. Вам это не нужно, используйте только исправление для словаря. –

+0

Вы могли использовать мой код в своем контексте? Пожалуйста, дайте мне знать. Если нет, пожалуйста, поделитесь своим кодом, а позже сегодня я посмотрю на него. –

+0

К сожалению нет ... Я не понимаю и как его использовать –

 Смежные вопросы

  • Нет связанных вопросов^_^