根据另一个例子,
我需要反序列化可以表示System.Collections.Generic.Dictionary<字符串,T>或System.Collections.Generic.List<T>。我想我必须编写自定义转换器,但我不确定它应该是什么样子。我使用的是.NET5的System.Text.Json.
字典类型的示例JSON(几乎一直发送(:
{
"1":
{
"13346964555":
{
"data1":1,
"data2":2
},
"13346964556":
{
"data1":1,
"data2":2
},
}
}
列表类型的示例JSON(罕见,需要转换为具有空字符串键的字典(:
{
"1": [
{
"data1":1,
"data2":2
},
{
"data1":1,
"data2":2
}
]
}
另一方面,从普通字典转换为其值列表也是可以接受的,因为我目前根本不需要键。
最终实现了从Dictionary到List的转换器。对我来说似乎很有效。如果这里出了什么问题,请随时讨论。注意,我只需要转换特定的字典类型,所以这里不需要转换器的工厂。
public class DictionaryToListConverter : JsonConverter<List<type>>
{
public override bool CanConvert(Type typeToConvert)
{
return typeof(List<type>) == typeToConvert;
}
public override List<type> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
bool is_array = reader.TokenType == JsonTokenType.StartArray;
bool is_dictionary = reader.TokenType == JsonTokenType.StartObject;
if (is_array || is_dictionary)
{
var list = new List<type>();
while (reader.Read())
{
if ((is_array && reader.TokenType == JsonTokenType.EndArray) || (is_dictionary && reader.TokenType == JsonTokenType.EndObject))
return list;
if (is_dictionary)
{
if (reader.TokenType != JsonTokenType.PropertyName)
throw new JsonException();
reader.Read(); // skip the key and move to value.
}
list.Add(JsonSerializer.Deserialize<type>(ref reader));
}
}
throw new JsonException();
}
public override void Write(Utf8JsonWriter writer, List<type> value, JsonSerializerOptions options)
{
// ...
}
}