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 に接続するなど、1 レベル深くする必要があります。これは任意であるため、value4 は異なるものにすることができます。これはどのように行うことができますか?

最後に、データを MongoDB に書き込みますが、タイプが JArray または JObject の場合、ドライバーは機能しません。ただし、構造化データが必要です。文字列では不十分です。

4

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