10

我有一个扁平的 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.FirstNameClient.LastNameClient.Email是对象中的Client属性。使用 Json.NET,有没有办法让它解析点符号并正确反序列化这个实体?目前,使用默认设置,它告诉我这Client.FirstName不是 type 中的属性Case

4

2 回答 2

5

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

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

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

然后,您将调用您用于执行序列化/反序列化的实例上的属性所公开Add的实例上的方法。JsonConverterCollectionConvertersJsonSerializer

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

应该注意的是,当您使用点表示法作为标识符时,这样做非常少见。如果可能,在构造 JSON 文字的一侧,它应该以这种方式进行:

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

但这是假设您可以控制该目标。如果你不这样做,那么你无能为力。

如果您确实有控制权,那么以这种方式构造您的 JSON 文字将不需要自定义JsonConverter实现。

于 2010-03-06T01:33:17.650 回答
-1

虽然只有一半的问题(即无助于您的对象已被压平的事实

您可以使用简单的方法以非常快速和肮脏的方式处理点符号

MyTargetClass retVal 
= JsonConvert.DeserializeObject<MyTargetClass>(jsonAsString.Replace(".", "_"));

在 MyTargetClass 上与适当的“_”属性名称组合,例如

public class MyTargetClass
{
    public string CaseName {get; set;}
    public DateTime CaseDate {get; set;}
    public string Client_FirstName {get; set;}

    //Other Properties
}
于 2014-06-28T13:30:40.077 回答