【发布时间】:2017-08-20 06:35:16
【问题描述】:
我有以下格式的 JSON:
{
"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 标识符是半随机的)
不幸的是,这与 Json.NET 已经 serializes/deserializes referenced objects 和我可以实现的 IReferenceResolver 不匹配似乎无法让我足够地调整行为(it's fixed to use "$ref" 开始)。
我还尝试为受影响的属性编写自定义 JsonConverter,但我似乎无法获得对根对象的 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 所需的格式。
标签: c# json json.net deserialization json-deserialization