当json对象具有$ ref到根对象列表时,使用JSON.net序列化对象

时间:2017-01-25 08:19:25

标签: c# json serialization json.net

我想知道当内部对象引用根对象列表项时是否可以序列化对象。小例子说明:情况:

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引用?

1 个答案:

答案 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