{
"users": [
{
"first_name": "John",
"last_name": "Smith",
"vet": [ "FOO", "VET-1" ],
"animals": [ [ "FOO", "ANIMAL-22" ] ]
},
{
"first_name": "Susan",
"last_name": "Smith",
"vet": [ "FOO", "VET-1" ]
}
],
"BAR": {
"VET-1": {
"vet_name": "Acme, Inc",
"vet_id": 456
},
"ANIMAL-22": {
"animal_name": "Fido",
"species": "dog",
"animal_id": 789,
"vet": [ "FOO", "VET-1" ]
}
}
}
一些嵌套对象或被多次引用的对象将被序列化为引用。
这些被引用的对象随后会包含在JSON对象末尾的BAR
数组中,并通过[ "FOO", "ANIMAL-22" ]
数组在原处标识。
(FOO
和BAR
都是静态常量,而ANIMAL-22
/VET-1
标识符则是半随机的)
BAR
属性的引用。
有没有办法覆盖Json.NET,将上面的JSON反序列化为这种C#类结构?
public class User
{
[JsonProperty("first_name")]
public string FirstName { get; set; }
[JsonProperty("last_name")]
public string LastName { get; set; }
[JsonProperty("vet")]
public Vet Vet { get; set; }
[JsonProperty("animals")]
public List<Animal> Animals { get; set; }
}
public class Vet
{
[JsonProperty("vet_id")]
public int Id { get; set; }
[JsonProperty("vet_name")]
public string Name { get; set; }
}
public class Animal
{
[JsonProperty("animal_id")]
public int Id { get; set; }
[JsonProperty("animal_name")]
public string Name { get; set; }
[JsonProperty("vet")]
public Vet Vet { get; set; }
[JsonProperty("species")]
public string Species { get; set; }
}
编辑 #1:尽管我在示例中只提供了
Animal
和Vet
,但是有很多类型以这种方式引用,并且我认为我需要一个“通用”或类型不可知的解决方案,可以处理任何出现[ "FOO", "..." ]
数组结构的情况,而不需要为每个C#类型单独编写代码。
"$ref"
属性名称,Json.NET是一个单通序列化器,但是"ANIMAL-22"
和"VET-1"
看起来是对稍后在文件中出现的JSON对象的前向引用,因此在读取引用时还没有被读取。您需要在反序列化后手动后处理对象以修复此类引用,或者使用LINQ to JSON将JSON预处理为Json.NET所需的格式。 - dbc