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

现在我需要更深一层,例如将另一个数组插入 value3。这是任意的,所以 value4 可以是不同的东西。怎么可能做到这一点?

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

4

1 回答 1

0

除了 JObject/JArray 之外,似乎没有内置的方法可以将深层嵌套的 json 反序列化/序列化。所以我改用字符串。我想可以编写一个转换器来处理所有事情,但在我的情况下不需要。

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);
    }
}
于 2013-09-12T04:31:55.243 回答