Конвертация Java объектов в JSON

Конвертация Java объектов есть одним из часто-используемых в разработке WEB-ресурсов. В этом уроке я покажу, как конвертировать Java объект в JSON или с JSON в Java объект.

Шаг 1

Для того чтобы манипулировать конвертированием мы будем использовать библиотеку Jackson.

Давайте создадим Maven project и добавим в pom.xml следующие зависимости:

<dependencies>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.2.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.2.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.2.2</version>
    </dependency>
</dependencies>

Шаг 2

Теперь добавим POJO который мы и будем конвертировать:

package pojo;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;

public class User {

    @JsonProperty("Number")
    private long id;

    @JsonProperty("First Name")
    private String name;

    @JsonProperty("Phone Number")
    private String phone;

    @JsonIgnore
    private String level;

    public User() {
    }

    public User(long id, String name, String phone, String level) {
        this.id = id;
        this.name = name;
        this.phone = phone;
        this.level = level;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getLevel() {
        return level;
    }

    public void setLevel(String level) {
        this.level = level;
    }

    @Override
    public String toString() {
        return "User[ID:" + id + ", Name: " + name + ", Phone: " + phone + "]";
    }
}

Обратите внимание, обязательно должен быть пустой конструктор и getter & setter.

Как вы видите мы используем две аннотации:

@JsonProperty(“name”) — эта говорит, что данный атрибут в JSON будет именоваться как name

@JsonIgnore — а эта аннотация игнорирует данный атрибут и в результате конвертирования он не будет добавлен в JSON.

Шаг 3

Теперь создадим класс конверте где будут все методы, и назовем его Converter.java:

package util;

import com.fasterxml.jackson.databind.ObjectMapper;
import pojo.User;

import java.io.File;
import java.io.IOException;

public class Converter {

    private final static String baseFile = "user.json";

    public static void toJSON(User user) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.writeValue(new File(baseFile), user);
        System.out.println("json created!");
    }

    public static User toJavaObject() throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(new File(baseFile), User.class);
    }

}

В результате выполнения появится файл user.json:

{"Number":1,"First Name":"Alex","Phone Number":"+38000000001"}

И после конвертации обратно в POJO мы получим объект с полями:

User[ID:1, Name: Alex, Phone: +38000000001]

Возникнут вопросы, выслушаю вас в комментариях.

Урок создан: 21 августа 2013 | Просмотров: 27914 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 21 августа 2013 в 15:34

    Александр

    Спасибо за статью, как раз сейчас разбираюсь с JSON. Может есть у вас в планах статья о JSON-Schema (json-schema.org)? И парсинг json’a по этой схеме и создание POJO? Было бы очень круто)

  • 30 августа 2013 в 20:13

    Евгений

    было бы полезнее данный пример привести с методами, которые позволили бы читать json не из файла. К примеру, я работаю с бд, в которой сохраняю значения полей объекта в одном строковом поле. В таком случае мне больше подошла бы такая реализация:

    public String objectToJson(Object obj) throws JsonProcessingException {
    String jsonObject = mapper.writeValueAsString(obj);
    return jsonObject;
    }

    public Object jsonToObject(String json) throws IOException {
    Object obj = mapper.readValue(json, Sample.class);
    return obj;
    }

    где Sample — класс, с которым мы работаем. Затем, при вызове метода jsonToObject нам останется только привести полученный объект к нашему типу и делать с ним все, что угодно. Точно также дело обстоит с методом objectToJson — получаем чистую строку, с которой можем делать что угодно — писать в файл, в базу, выполнять манипуляции в коде и т.д. Я к тому, что такой пример был бы более абстрактен. Но в целом все отлично, мне нравятся ваши статьи

    • 02 сентября 2013 в 16:23

      Александр Барчук

      Евгений, полностью с вами согласен, но хотелось показать на примере файла, что бы новичкам было понятней.

  • 17 апреля 2014 в 19:20

    Ярослав

    А что будет если не добить Json нотации перед полями, класса, который мы собираемся переводить в json. И еще.. Корректно ли будет проводится конвертация встроенного класса, например Key или Location или DATATIME? Еще хотелось бы услышать про особенности использования библиотеки gson. Спасибо за доступную форму предоставления материала.

    • 18 апреля 2014 в 09:27

      Александр Барчук

      Без аннотаций вы скорее всего получите Exception но уже не помню, надо проверить, Да со встроеными классами это тоже должно нормально работать, но опять же давно делал и не могу сказать точно .

      • 26 февраля 2015 в 09:50

        Павел

        Исключений не будет, данные в любом случае попадут в файл, просто если не указать аннотацию над полем, то имя ключа в json будет соответствовать имени поля.

  • 17 апреля 2014 в 19:23

    Ярослав

    Что такое POJO?

    • 18 апреля 2014 в 09:29

      Александр Барчук

      Plain Old Java Object — простой Java-объект, не унаследованный от какого-то объекта и не реализующий никаких служебных интерфейсов.

  • 21 января 2015 в 14:38

    Alexandra

    Добрый день, а скажите, если User будет наследовать интерфейс, как это разрулить?

  • 21 мая 2015 в 18:21

    Андрей

    Спасибо большое. Статья очень помогла:)

  • 20 июля 2015 в 23:00

    Сергей

    подскажите полезные ресурсы по следующей задаче — как перегнать json файл в xml без создания POJO на java? Есть огромный json файл и задача — переконвертировать его в xml. Этот xml должен иметь аттрибуты, которые он возьмет, собственно, из этого же json файла. Перегнать в xml получилось, но аттрибуты выглядят просто как содержимое тегов, например 4324

  • 18 января 2016 в 14:33

    Zhn

    Как можно json перевести на javafx?

  • 23 февраля 2017 в 13:19

    Вадим

    Я конвертирую класс Foo который унаследован от Bar. И при конвертации он добавляет все поля родителя. Как мне указать, что из родительского класса надо конвертировать только поле children? Изменить родительский класс я не могу.