← Назад к вопросам
Как преобразовать 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 приложений. Всегда валидируйте данные после десериализации.