2014-01-09 5 views
18

Я использовал словарь в проекте Web API, который сериализации как то в формате JSON:JSON Список Serialize <KeyValuePair <строка, объект >>

{"keyname":{objectvalue},"keyname2:".... 

Поскольку у меня есть дубликаты ключей я could't использовать словарь типа больше, и вместо этого в настоящее время я использую List<KeyValuePair<string,object>>.

Но это сериализации таким образом:

[{"Key":"keyname","Value":"objectvalue"}... 

есть ли способ, чтобы иметь List<KeyValuePair> сериализовать то же ш ay словарь делает?

Спасибо.

+1

Если у вас есть дубликат ключи, нет. –

+0

@ user250773: можете ли вы предоставить код и выход ... чтобы мы могли попытаться помочь вам. –

+0

Возможный дубликат [Сериализация списка > как JSON] (https://stackoverflow.com/questions/41503024/serialize-listkeyvaluepairstring-string-as-json) – Matt

ответ

32

Если вы используете библиотеку Newtonsoft Json.NET, вы можете сделать следующее.

Определить конвертер, чтобы написать список пар ключ/значение, как вы хотите:

class MyConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     List<KeyValuePair<string, object>> list = value as List<KeyValuePair<string, object>>; 
     writer.WriteStartArray(); 
     foreach (var item in list) 
     { 
      writer.WriteStartObject(); 
      writer.WritePropertyName(item.Key); 
      writer.WriteValue(item.Value); 
      writer.WriteEndObject(); 
     } 
     writer.WriteEndArray(); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     // TODO... 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(List<KeyValuePair<string, object>>); 
    } 
} 

Затем использовать преобразователь:

var keyValuePairs = new List<KeyValuePair<string, object>> 
        { 
         new KeyValuePair<string, object>("one", 1), 
         new KeyValuePair<string, object>("two", 2), 
         new KeyValuePair<string, object>("three", 3) 
        }; 

JsonSerializerSettings settings = new JsonSerializerSettings { Converters = new [] {new MyConverter()} }; 
string json = JsonConvert.SerializeObject(keyValuePairs, settings); 

Это создает [{"one":1},{"two":2},{"three":3}]

+0

благодарит Патрика, который разрешил мою проблему. – user250773

+0

Есть ли простой пример того, как работает метод ReadJson? У меня аналогичная проблема при смене десериализации из словаря <строки, строка> в список > , используя этот формат: { "key1": "тест", "key1":» 12345678 ", " key2 ":" ABC ", } – user250773

+0

@ user250773 [Этот блог] (http://dotnetbyexample.blogspot.com/2012/02/json-deserialization-with-jsonnet-class.html) должен быть достаточно информации, чтобы доставить вас туда. –

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