反序列化深层嵌套数组

时间:2013-09-11 12:45:02

标签: c# mongodb json.net

目前,我有这个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);
    }
}

现在我需要更深入一级,例如将另一个数组插入value3。这是任意的,因此value4可能是不同的。怎么可以这样做?

最后我将数据写入MongoDB,如果类型是JArray或JObject,则驱动程序不起作用。但是我需要结构化数据,字符串是不够的。

1 个答案:

答案 0 :(得分: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);
    }
}