Looking for java Keywords? Try Ask4Keywords

Java Language Пользовательская десериализация JSON с Джексоном


пример

Мы используем API для отдыха как формат JSON, а затем отключаем его до POJO. Джексон's org.codehaus.jackson.map.ObjectMapper «просто работает» из коробки, и мы действительно ничего не делаем в большинстве случаев. Но иногда нам нужен настраиваемый десериализатор для выполнения наших собственных потребностей, и этот учебник поможет вам в создании собственного пользовательского десериализатора.

Допустим, у нас есть следующие сущности.

public class User {
    private Long id;
    private String name;
    private String email;

    //getter setter are omitted for clarity 
}

А также

public class Program {
    private Long id;
    private String name;
    private User createdBy;
    private String contents;

    //getter setter are omitted for clarity
}

Давайте сначала сериализуем / маршалируем объект.

User user = new User();
user.setId(1L);
user.setEmail("example@example.com");
user.setName("Bazlur Rahman");

Program program = new Program();
program.setId(1L);
program.setName("Program @# 1");
program.setCreatedBy(user);
program.setContents("Some contents");

ObjectMapper objectMapper = new ObjectMapper();

final String json = objectMapper.writeValueAsString (программа); System.out.println (JSON);

Вышеприведенный код будет содержать следующие JSON-

{
    "id": 1,
    "name": "Program @# 1",
    "createdBy": {
        "id": 1,
        "name": "Bazlur Rahman",
        "email": "example@example.com"
    },
    "contents": "Some contents"
}

Теперь можно сделать обратное очень легко. Если у нас есть этот JSON, мы можем развязать объект программы с помощью ObjectMapper следующим образом:

Скажем так, это не настоящий случай, у нас будет другой JSON из API, который не соответствует нашему классу Program .

{
"id": 1,
"name": "Program @# 1",
"ownerId": 1
"contents": "Some contents"
}

Посмотрите на строку JSON, вы можете видеть, у нее есть другое поле, которое является owenerId.

Теперь, если вы хотите сериализовать этот JSON, как мы это делали ранее, у вас будут исключения.

Есть два способа избежать исключений и сделать это сериализованным -

Игнорировать неизвестные поля

Игнорируйте onwerId . Добавьте в класс программы следующую аннотацию

@JsonIgnoreProperties(ignoreUnknown = true)
public class Program {}

Напишите пользовательский десериализатор

Но есть случаи, когда вам действительно нужно это поле owerId . Предположим, вы хотите связать его как идентификатор класса User .

В таком случае вам нужно написать собственный десериализатор,

Как вы можете видеть, сначала вам нужно получить доступ к JsonNode из JonsParser . А затем вы можете легко извлекать информацию из JsonNode с помощью метода get() . и вы должны убедиться в имени поля. Это должно быть точное имя, ошибка орфографии приведет к исключениям.

И , наконец, вы должны зарегистрировать свой ProgramDeserializer в ObjectMapper .

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Program.class, new ProgramDeserializer());
 
mapper.registerModule(module);
 
String newJsonString = "{\"id\":1,\"name\":\"Program @# 1\",\"ownerId\":1,\"contents\":\"Some contents\"}";
final Program program2 = mapper.readValue(newJsonString, Program.class);

Кроме того, вы можете использовать аннотацию для регистрации десериализатора напрямую -

@JsonDeserialize(using = ProgramDeserializer.class)
public class Program {
}