← Назад к вопросам

Как преобразовать JSON объект в Java объект

2.0 Middle🔥 61 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Как преобразовать JSON объект в Java объект

Десериализация JSON в Java объекты — один из самых часто встречающихся паттернов в разработке. Рассмотрю основные подходы и инструменты.

1. Jackson - наиболее популярная библиотека

Подключение зависимости

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

Базовое преобразование

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonExample {
    
    public static class User {
        public String name;
        public int age;
        public String email;
        
        // Getters/Setters
        public User() {}
        public User(String name, int age, String email) {
            this.name = name;
            this.age = age;
            this.email = email;
        }
    }
    
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        
        // JSON строка
        String jsonString = "{\"name\":\"Alice\",\"age\":30,\"email\":\"alice@example.com\"}";
        
        // Преобразование JSON в объект
        User user = mapper.readValue(jsonString, User.class);
        
        System.out.println(user.name);   // Alice
        System.out.println(user.age);    // 30
        System.out.println(user.email);  // alice@example.com
    }
}

Преобразование массива JSON

ObjectMapper mapper = new ObjectMapper();

// JSON массив
String jsonArray = "[\"Alice\",\"Bob\",\"Charlie\"]";

// В List
List<String> names = mapper.readValue(jsonArray, 
    new TypeReference<List<String>>() {});

System.out.println(names);  // [Alice, Bob, Charlie]

// В массив объектов
String jsonObjects = "[{\"name\":\"Alice\"},{\"name\":\"Bob\"}]";
List<User> users = mapper.readValue(jsonObjects, 
    new TypeReference<List<User>>() {});

2. Работа с полями JSON

JsonProperty для маппинга имен

import com.fasterxml.jackson.annotation.JsonProperty;

public class User {
    @JsonProperty("user_name")  // JSON поле: user_name
    private String name;
    
    @JsonProperty("user_email")
    private String email;
    
    // Getters/Setters
}

// JSON: {"user_name":"Alice","user_email":"alice@example.com"}
User user = mapper.readValue(json, User.class);

JsonIgnore для игнорирования полей

public class User {
    private String name;
    
    @JsonIgnore  // Это поле не будет десериализовано из JSON
    private String password;
    
    @JsonIgnore  // И не будет сериализовано в JSON
    private String internalId;
}

JsonInclude для условного сериализации

import com.fasterxml.jackson.annotation.JsonInclude;

@JsonInclude(JsonInclude.Include.NON_NULL)  // Только не-null значения
public class User {
    private String name;
    private String middleName;  // Если null, не включится в JSON
    private String email;
}

3. Сложные объекты и вложенные структуры

Вложенные объекты

public class Address {
    public String street;
    public String city;
    public String country;
}

public class User {
    public String name;
    public Address address;  // Вложенный объект
}

String json = "{\"name\":\"Alice\",address:{street:123 Main St,city:NYC,country:USA}}";

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);
System.out.println(user.address.city);  // NYC

Коллекции объектов

public class Company {
    public String name;
    public List<User> employees;
    public Map<String, String> settings;
}

String json = "{name:TechCorp,employees:[{name:Alice},{name:Bob}],settings:{theme:dark,language:en}}";

ObjectMapper mapper = new ObjectMapper();
Company company = mapper.readValue(json, Company.class);
System.out.println(company.employees.size());  // 2
System.out.println(company.settings.get("theme"));  // dark

4. Обработка ошибок десериализации

ObjectMapper mapper = new ObjectMapper();

try {
    String invalidJson = "{name:Alice,}";
    User user = mapper.readValue(invalidJson, User.class);
} catch (com.fasterxml.jackson.core.JsonParseException e) {
    System.err.println("Синтаксическая ошибка JSON: " + e.getMessage());
} catch (com.fasterxml.jackson.databind.JsonMappingException e) {
    System.err.println("Ошибка маппинга полей: " + e.getMessage());
} catch (Exception e) {
    System.err.println("Общая ошибка: " + e.getMessage());
}

5. Google Gson - альтернатива Jackson

Подключение

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>

Использование Gson

import com.google.gson.Gson;
import com.google.gson.JsonObject;

public class GsonExample {
    
    public static void main(String[] args) {
        Gson gson = new Gson();
        
        String jsonString = "{name:Alice,age:30}";
        
        // Преобразование в объект
        User user = gson.fromJson(jsonString, User.class);
        System.out.println(user.name);  // Alice
        
        // Преобразование в JsonObject
        JsonObject jsonObj = gson.fromJson(jsonString, JsonObject.class);
        System.out.println(jsonObj.get("name"));  // Alice
    }
}

6. JSON-B стандарт

Подключение

<dependency>
    <groupId>jakarta.json.bind</groupId>
    <artifactId>jakarta.json.bind-api</artifactId>
    <version>3.0.0</version>
</dependency>

Использование JSON-B

import jakarta.json.bind.Jsonb;
import jakarta.json.bind.JsonbBuilder;

public class JsonbExample {
    
    public static void main(String[] args) {
        Jsonb jsonb = JsonbBuilder.create();
        
        String jsonString = "{name:Alice,age:30}";
        User user = jsonb.fromJson(jsonString, User.class);
        
        System.out.println(user.name);  // Alice
    }
}

7. Работа с неизвестной структурой JSON

import com.fasterxml.jackson.databind.JsonNode;

ObjectMapper mapper = new ObjectMapper();

String json = "{name:Alice,extra:field}";
JsonNode node = mapper.readTree(json);

String name = node.get("name").asText();  // Alice
String extra = node.get("extra").asText();  // field
boolean hasAge = node.has("age");  // false

8. Пользовательские десериализаторы

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

public class CustomUserDeserializer extends JsonDeserializer<User> {
    @Override
    public User deserialize(JsonParser jp, DeserializationContext context) 
            throws IOException {
        JsonNode node = jp.getCodec().readTree(jp);
        
        String name = node.get("name").asText();
        int age = node.get("age").asInt();
        String email = node.get("email").asText().toLowerCase();  // Custom logic
        
        return new User(name, age, email);
    }
}

// Применение
@JsonDeserialize(using = CustomUserDeserializer.class)
public class User { ... }

9. Лучшие практики

1. Использование Records (Java 16+)

public record User(String name, int age, String email) {}

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);

2. Валидация после десериализации

import javax.validation.Valid;
import javax.validation.constraints.*;

public class User {
    @NotBlank
    private String name;
    
    @Min(18)
    @Max(120)
    private int age;
    
    @Email
    private String email;
}

ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);

3. Кэширование ObjectMapper

@Component
public class JsonService {
    private static final ObjectMapper MAPPER = new ObjectMapper();
    
    public <T> T fromJson(String json, Class<T> type) throws Exception {
        return MAPPER.readValue(json, type);
    }
}

Заключение

Для преобразования JSON в Java объекты используйте Jackson как стандарт, Gson для простоты и JSON-B для Jakarta EE приложений. Всегда валидируйте данные после десериализации.

Как преобразовать JSON объект в Java объект | PrepBro