Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Зачем нужен JSON
JSON (JavaScript Object Notation) — это универсальный, лёгкий текстовый формат для обмена данными между компонентами системы.
1. Определение и синтаксис
JSON основан на двух структурах:
- Объект — неупорядоченный набор пар ключ-значение
- Массив — упорядоченный список значений
{
"id": 123,
"name": "John Doe",
"email": "john@example.com",
"active": true,
"roles": ["user", "admin"],
"address": {
"city": "Moscow",
"zipcode": "101000"
},
"lastLogin": "2026-03-22T15:30:00Z"
}
Типы данных в JSON:
- string: "value"
- number: 42, 3.14
- boolean: true, false
- array: [1, 2, 3]
- object: { "key": "value" }
- null: null
2. Зачем нужен JSON в Java приложениях
REST API — главное применение
// GET запрос
GET /api/v1/users/123
Accept: application/json
// Ответ
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": 123,
"name": "John Doe",
"email": "john@example.com"
}
@RestController
@RequestMapping("/api/v1/users")
public class UserController {
@GetMapping("/{id}")
public UserDTO getUser(@PathVariable Long id) {
User user = userService.findById(id);
return userMapper.toDTO(user); // Автоматически сериализуется в JSON
}
@PostMapping
public ResponseEntity<UserDTO> createUser(@RequestBody CreateUserRequest request) {
// @RequestBody автоматически десериализует JSON в объект
User user = userService.create(request);
return ResponseEntity.status(201).body(userMapper.toDTO(user));
}
}
Сериализация (Object to JSON)
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonSerializationExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
User user = new User(123L, "John Doe", "john@example.com");
// Сериализация: объект → JSON
String jsonString = mapper.writeValueAsString(user);
System.out.println(jsonString);
// {"id":123,"name":"John Doe","email":"john@example.com"}
}
}
Десериализация (JSON to Object)
public class JsonDeserializationExample {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String jsonString = "{\"id\":123,\"name\":\"John Doe\",\"email\":\"john@example.com\"}";
// Десериализация: JSON → объект
User user = mapper.readValue(jsonString, User.class);
System.out.println(user.getName()); // John Doe
}
}
3. Основные библиотеки JSON для Java
Jackson (самая популярная)
import com.fasterxml.jackson.annotation.*;
public class User {
@JsonProperty("user_id") // Переименование поля при сериализации
private Long id;
@JsonIgnore // Не включать в JSON
private String password;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'")
private LocalDateTime createdAt;
@JsonInclude(JsonInclude.Include.NON_NULL) // Не включать null значения
private String middleName;
@JsonAnySetter // Для дополнительных полей
private Map<String, Object> additionalProperties = new HashMap<>();
}
Gson (Google)
import com.google.gson.Gson;
public class GsonExample {
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.create();
User user = new User(123L, "John Doe", "john@example.com");
String json = gson.toJson(user); // Сериализация
User deserialized = gson.fromJson(json, User.class); // Десериализация
}
}
JSON-B (стандарт Java)
import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;
public class JsonBExample {
public static void main(String[] args) {
Jsonb jsonb = JsonbBuilder.create();
User user = new User(123L, "John Doe", "john@example.com");
String json = jsonb.toJson(user);
}
}
4. Практические применения JSON
Обмен данными между frontend и backend
// Frontend (JavaScript)
fetch('/api/v1/users', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'John', email: 'john@example.com' })
}).then(r => r.json()).then(data => console.log(data));
// Backend (Java)
@PostMapping
public ResponseEntity<UserDTO> createUser(@RequestBody CreateUserRequest request) {
User user = userService.create(request);
return ResponseEntity.ok(userMapper.toDTO(user));
}
Логирование структурированных данных
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.fasterxml.jackson.databind.ObjectMapper;
public class StructuredLogging {
private static final Logger logger = LoggerFactory.getLogger(StructuredLogging.class);
private static final ObjectMapper mapper = new ObjectMapper();
public void logPayment(Long userId, BigDecimal amount, String status) {
Map<String, Object> logEvent = Map.of(
"event", "payment_processed",
"user_id", userId,
"amount", amount,
"status", status,
"timestamp", LocalDateTime.now()
);
try {
String jsonLog = mapper.writeValueAsString(logEvent);
logger.info(jsonLog); // Логируется в JSON формате
} catch (Exception e) {
logger.error("Failed to log payment", e);
}
}
}
Это позволяет парсить логи в ELK Stack и анализировать события.
Конфигурационные файлы
{
"spring": {
"datasource": {
"url": "jdbc:postgresql://localhost:5432/mydb",
"username": "postgres",
"password": "password"
},
"jpa": {
"hibernate": {
"ddl-auto": "validate"
}
}
}
}
Кэширование и сессии
import redis.clients.jedis.Jedis;
public class RedisSessionCache {
private Jedis jedis = new Jedis("localhost");
private ObjectMapper mapper = new ObjectMapper();
public void saveUserSession(String sessionId, User user) throws Exception {
String json = mapper.writeValueAsString(user);
jedis.setex("session:" + sessionId, 3600, json); // TTL 1 час
}
public User getUserSession(String sessionId) throws Exception {
String json = jedis.get("session:" + sessionId);
return mapper.readValue(json, User.class);
}
}
5. Преимущества JSON
| Преимущество | Пример |
|---|---|
| Читаемость | Легко разобрать человеку |
| Компактность | Меньше чем XML |
| Универсальность | Поддерживается везде (JS, Python, Go и т.д.) |
| Простота | Минимум синтаксиса |
| Производительность | Быстрая сериализация/десериализация |
| Язык-агностичность | Не зависит от языка программирования |
6. JSON vs альтернативы
| Формат | Использование | Размер |
|---|---|---|
| JSON | REST API, конфиги, логирование | Средний |
| XML | SOAP, конфиги (устаревает) | Большой |
| Protocol Buffers | gRPC, микросервисы | Минимальный |
| MessagePack | Binary serialization, высокая скорость | Минимальный |
| YAML | Конфиги, читаемость | Средний |
Заключение
JSON — это де-факто стандарт для обмена данными в веб-приложениях. В Java разработке он используется в REST API, логировании, кэшировании и конфигурировании. Основная библиотека — Jackson, которая интегрирована в Spring Framework и обеспечивает автоматическую сериализацию/десериализацию.