目前,我有这个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,则驱动程序不起作用。但是我需要结构化数据,字符串是不够的。
答案 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);
}
}