Может ли Json.NET десериализовать уплощенную строку JSON с точечной нотацией? - PullRequest
10 голосов
/ 06 марта 2010

У меня сплющенный 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.

Ответы [ 2 ]

5 голосов
/ 06 марта 2010

Да, вы можете. Вы должны получить класс из JsonConverter и переопределить метод CanConvert, чтобы указать, что вы можете преобразовать тип Client.

Затем вы должны переопределить методы ReadJson и WriteJson для чтения и записи полей литерала JSON.

Для такого литерала JSON более вероятно, что вам потребуется создать JsonConverter для типа Case, так как вам потребуется кэшировать все свойства объекта Client во время сериализации, пока вы не получите достаточно информации для создания экземпляра Client.

Затем вы вызываете метод Add для экземпляра JsonConverterCollection, предоставляемого свойством Converters для экземпляра JsonSerializer вы используете для выполнения сериализации / десериализации.

Обратите внимание, что если вам нужно сделать это для ряда различных классов, которые могут быть представлены таким образом, то вы можете написать одну JsonConverter реализацию и заставить ее сканировать атрибут в имущество. Если свойство имеет атрибут и предоставляет другой объект со свойствами, оно будет ожидать чтения / записи точечной нотации.

Следует отметить, что, хотя вы используете точечную нотацию для идентификатора, это очень редко случается. Если возможно, на стороне, которая создает литерал JSON, он должен делать это следующим образом:

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

Но это предполагает, что у вас есть контроль над этим концом. Если вы этого не сделаете, то мало что можете сделать.

Если у вас есть контроль, то построение литералов JSON таким образом устранит необходимость в пользовательской реализации JsonConverter.

0 голосов
/ 28 июня 2014

Хотя только половина проблемы (т.е. не помогает с тем фактом, что ваш объект был сплющен )

Вы можете иметь дело с точечной нотацией очень быстрым и грязным способом с простым

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...