是的,处理此问题的直接方法是为您的documents 属性使用Dictionary<string, Item>。随机的文档名称将成为字典的键。您可以像这样声明类:
class RootObject
{
public Result Result { get; set; }
}
class Result
{
public Dictionary<string, Item> Documents { get; set; }
}
class Item
{
public string PropertyX { get; set; }
public string PropertyY { get; set; }
}
然后像这样反序列化 JSON:
RootObject root = JsonConvert.DeserializeObject<RootObject>(json);
小提琴:https://dotnetfiddle.net/lTDGj3
如果你不想在你的类中使用字典,而是真的希望有一个项目数组(或列表),那么是的,你需要一个转换器。在这种情况下,你可以像这样声明你的类:
class RootObject
{
public Result Result { get; set; }
}
class Result
{
[JsonConverter(typeof(DocumentListConverter))]
public List<Item> Documents { get; set; }
}
class Item
{
public string Name { get; set; }
public string PropertyX { get; set; }
public string PropertyY { get; set; }
}
文档列表的自定义转换器类如下所示:
class DocumentListConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(List<Item>);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject jo = JObject.Load(reader);
List<Item> items = new List<Item>();
foreach (JProperty prop in jo.Properties())
{
Item item = prop.Value.ToObject<Item>();
item.Name = prop.Name;
items.Add(item);
}
return items;
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
你会像以前一样反序列化:
RootObject root = JsonConvert.DeserializeObject<RootObject>(json);
小提琴:https://dotnetfiddle.net/xWRMGP