序列化 – Json.NET可以使用点符号反序列化一个扁平化的JSON字符串吗?

我有一个扁平的 JSON

{
    "CaseName" : "John Doe v. State",
    "CaseDate" : "<some date>",
    "Client.FirstName" : "John",
    "Client.LastName" : "Doe",
    "Client.Email" : "johndoe@gmail.com"
    etc...
}

我想反序列回这个实体:

public class Case()
{
    public string CaseName { get; set; }
    public string CaseDate { get; set; }
    public Client Client { get; set; }
}

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

是的你可以.您将从 JsonConverter导出一个类,并将 CanConvert方法替换为可以转换客户端类型的标记.

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

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

然后,您可以在JsonSerializer实例上公布的JsonConverterCollection实例上调用Add方法,该实例是用于执行序列化/反序列化的JsonSerializer实例.

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

应该注意的是,当您使用点符号作为标识符时,很常见.如果可能的话,在构建JSON文字的一边,它应该这样做:

{ 
    CaseName: "John Doe v. State", 
    CaseDate: "<some date>", 
    Client: 
    {
        FirstName: "John", 
        LastName: "Doe", 
        Email: "johndoe@gmail.com"
    }
}

但这是假设你有这个目的的控制权.如果没有,那么你可以做的不多.

如果你有控制权,那么以这种方式构建你的JSON文字就不会需要一个自定义的JsonConverter实现.

相关文章
相关标签/搜索