我想知道当内部对象引用根对象列表项时是否可以序列化对象。小例子说明:情况:
class Project
{
public List<Template> Templates { get; set; }
public List<Task> Tasks { get; set; }
}
class Template
{
public string Name { get; set; }
}
class Task
{
public Template Template { get; set; }
}
class Program
{
static void Main(string[] args)
{
var template2 = new Template { Name = "Temp2" };
var project = new Project
{
Templates = new List<Template>
{
new Template {Name = "Temp1"},
template2,
new Template {Name = "Temp3"}
}
};
var task = new Task {Template = template2};
project.Tasks = new List<Task> {task};
Console.WriteLine(ReferenceEquals(project.Templates[1], project.Tasks.First().Template));
var json = JsonConvert.SerializeObject(project);
var projectFromJson =
JsonConvert.DeserializeObject<Project>(
"{\"Templates\":[{\"Name\":\"Temp1\"},{\"Name\":\"Temp2\"},{\"Name\":\"Temp3\"}],\"Tasks\":[{\"Template\":{\"$ref\":\"$.Templates[?@.Name == 'Temp2']\"}}]}");
Console.WriteLine(ReferenceEquals(projectFromJson.Templates[1], projectFromJson.Tasks.First().Template));
Console.Read();
}
}
因此,在此示例中,我希望具有属性Template的Task对象将引用Project对象模板列表中的template2对象。因此,在序列化之前创建它时,ReferenceEquals显示两个对象引用相等,但在反序列化后再次尝试时返回false,因为Task对象Template属性为null,因此这意味着JSON.net不会序列化它。
现在它看起来像JSON.net JObject一样知道JSONpath语法,但它不能用于反序列化。我知道有IReferenceResolver,但我不确定这个可以帮助我。
是否可以使用JSON.net并且可能还有其他序列化程序允许使用JSONpath引用?
答案 0 :(得分:1)
这是PreserveReferencesHandling
的用途:
glGetError()
请注意,Json.NET使用自己的引用语法而不是JSONpath。对象层次结构的JSON如下所示:
id Name Age Group
-----------------------
1 Alpha 11 A
2 Bravo 12 A
3 Alpha 11 B
4 Bravo 12 B
5 Delta 11 B