Json.NET可以用点表示法反序化扁平的JSON字符串吗?

Dan*_* T. 10 syntax serialization json.net

我有一个扁平的JSON:

{
    "CaseName" : "John Doe v. State",
    "CaseDate" : "<some date>",
    "Client.FirstName" : "John",
    "Client.LastName" : "Doe",
    "Client.Email" : "johndoe@gmail.com"
    etc...
}
Run Code Online (Sandbox Code Playgroud)

我想将它反序列化回这个实体:

public class Case()
{
    public string CaseName { get; set; }
    public string CaseDate { get; set; }
    public Client Client { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

where Client.FirstName,Client.LastNameClient.EmailClient对象中的属性.使用Json.NET,有没有办法让它解析点符号并正确反序列化这个实体?目前,使用默认设置,它告诉我这Client.FirstName不是类型中的属性Case.

cas*_*One 5

是的你可以.您将从中派生一个类JsonConverter并覆盖该CanConvert方法以指示您可以转换该Client类型.

然后,您将覆盖ReadJsonWriteJson方法以读取和写入JSON文字的字段.

对于像这样的JSON文字,您很可能需要JsonConverter为该Case类型创建一个,因为Client在序列化期间需要缓存对象的所有属性,直到您有足够的信息来实际创建Client实例.

然后,您将Add在用于执行序列化/反序列化的实例上的属性JsonConverterCollection公开的实例上调用该方法.ConvertersJsonSerializer

请注意,如果您需要为可能以这种方式表示的许多不同类执行此操作,那么您可以编写一个 JsonConverter实现,并让它扫描属性上的属性.如果属性具有该属性并使用属性公开另一个对象,则它将期望读/写点符号.

应该注意的是,当您使用点符号作为标识符时,这种情况非常罕见.如果可能的话,在构建JSON文字的那一边,它应该以这种方式执行:

{ 
    CaseName: "John Doe v. State", 
    CaseDate: "<some date>", 
    Client: 
    {
        FirstName: "John", 
        LastName: "Doe", 
        Email: "johndoe@gmail.com"
    }
} 
Run Code Online (Sandbox Code Playgroud)

但这是假设你有控制权.如果你不这样做,那么你就无能为力了.

如果你有控制权,那么以这种方式构建你的JSON文字将无需自定义JsonConverter实现.