2013-09-11 2 views
0

В настоящее время, у меня есть JSon структура:десериализация глубоко вложенных массивы

{ 
    key1: value1, 
    key2: 
     [ 
      {key3: value3} 
      {key4: value4} 
     ] 
} 

и десериализации его в типы

IDictionary<string, object> 
IDictionary<string, IList<Dictionary<string, object>>> 

с использованием CustomCreationConverter:

public class NestedArrayConverter : CustomCreationConverter<IList<Dictionary<string, object>>> 
{ 
    public override IList<Dictionary<string, object>> Create(Type objectType) 
    { 
     return new List<Dictionary<string, object>>(); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.TokenType == JsonToken.StartArray) 
      return base.ReadJson(reader, objectType, existingValue, serializer); 

     return serializer.Deserialize(reader); 
    } 
} 

Теперь мне нужно идти на один уровень глубже, например подключение другого массива в значение3. Это произвольно, поэтому value4 может быть чем-то другим. Как это можно сделать?

В конце я записываю данные в MongoDB, и драйвер не работает, если тип JArray или JObject. Однако мне нужны структурированные данные, строки недостаточно.

+3

Почему строки недостаточно? Не можете ли вы просто написать строку с JSON в базу данных? –

+0

Данные должны быть доступны для запроса на первом уровне, например. для значения1. Это исключает преобразование всего объекта в строку. Однако это может быть частично строка. См. Мой ответ. –

ответ

0

Кажется, что нет встроенного способа дезактивации/сериализации глубоко вложенного json во что-либо иное, кроме JObject/JArray. Поэтому вместо этого я использую строки. Я полагаю, что можно написать конвертер для обработки всего, что не нужно в моем случае.

public class NestedArrayConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     if (value.GetType() == typeof(List<string>)) 
     { 
      var list = (List<string>)value; 
      writer.WriteStartArray(); 

      foreach (var str in list) 
       writer.WriteRawValue(str); 

      writer.WriteEndArray(); 
     } 
     else 
     { 
      writer.WriteValue(value); 
     } 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.TokenType == JsonToken.StartArray) 
     { 
      reader.Read(); 
      var value = new List<string>(); 

      while (reader.TokenType != JsonToken.EndArray) 
      { 
       value.Add(JObject.Load(reader).ToString()); 
       reader.Read(); 
      } 

      return value; 
     } 

     return serializer.Deserialize(reader); 
    } 
} 
Смежные вопросы