[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-serializatsiya-kak-kastomizirovat-serializatsiyu-v-jackson":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},981,"kak-kastomizirovat-serializatsiyu-v-jackson",30,"serializatsiya","Сериализация","📦","Как кастомизировать сериализацию в Jackson?","Jackson предоставляет несколько механизмов кастомизации: пользовательские сериализаторы\u002Fдесериализаторы, аннотации для управления созданием объектов и mix-ins для работы с классами, которые нельзя модифицировать.\n\n### Custom Serializer \u002F Deserializer\n\nНаследуются от `StdSerializer` \u002F `StdDeserializer` и применяются через аннотацию `@JsonSerialize` \u002F `@JsonDeserialize`.\n\n\u003Cdetails>\n\u003Csummary>Пример кастомного сериализатора и десериализатора\u003C\u002Fsummary>\n\n```java\n\u002F\u002F Сериализатор: Money -> \"100.50 RUB\"\npublic class MoneySerializer extends StdSerializer\u003CMoney> {\n    public MoneySerializer() { super(Money.class); }\n\n    @Override\n    public void serialize(Money value, JsonGenerator gen,\n                          SerializerProvider provider) throws IOException {\n        gen.writeString(value.getAmount().toPlainString() + \" \" + value.getCurrency());\n    }\n}\n\n\u002F\u002F Десериализатор: \"100.50 RUB\" -> Money\npublic class MoneyDeserializer extends StdDeserializer\u003CMoney> {\n    public MoneyDeserializer() { super(Money.class); }\n\n    @Override\n    public Money deserialize(JsonParser p, DeserializationContext ctxt)\n            throws IOException {\n        String text = p.getText(); \u002F\u002F \"100.50 RUB\"\n        String[] parts = text.split(\" \");\n        return new Money(new BigDecimal(parts[0]), parts[1]);\n    }\n}\n\n\u002F\u002F Применение\npublic class Order {\n    @JsonSerialize(using = MoneySerializer.class)\n    @JsonDeserialize(using = MoneyDeserializer.class)\n    private Money totalPrice;\n}\n```\n\n\u003C\u002Fdetails>\n\n### Аннотации для управления созданием объектов\n\n| Аннотация | Назначение |\n|-----------|-----------|\n| `@JsonCreator` | Десериализация через конструктор\u002Fфабричный метод (для иммутабельных объектов) |\n| `@JsonValue` | Объект сериализуется как одно значение (часто для enum) |\n| `@JsonUnwrapped` | Развёртывание вложенного объекта на уровень выше |\n\n\u003Cdetails>\n\u003Csummary>Примеры: JsonCreator, JsonValue, JsonUnwrapped\u003C\u002Fsummary>\n\n```java\n\u002F\u002F @JsonCreator — иммутабельный объект без конструктора по умолчанию\npublic class Address {\n    private final String city;\n    private final String street;\n\n    @JsonCreator\n    public Address(\n            @JsonProperty(\"city\") String city,\n            @JsonProperty(\"street\") String street) {\n        this.city = city;\n        this.street = street;\n    }\n    \u002F\u002F Только getters\n}\n\n\u002F\u002F @JsonValue — enum сериализуется как строка\npublic enum Status {\n    ACTIVE(\"active\"), INACTIVE(\"inactive\");\n    private final String code;\n    Status(String code) { this.code = code; }\n\n    @JsonValue\n    public String getCode() { return code; }\n\n    @JsonCreator\n    public static Status fromCode(String code) {\n        return Arrays.stream(values())\n                .filter(s -> s.code.equals(code))\n                .findFirst().orElseThrow();\n    }\n}\n\n\u002F\u002F @JsonUnwrapped — развёртывание вложенного объекта\npublic class Person {\n    private String name;\n\n    @JsonUnwrapped\n    private Address address;\n    \u002F\u002F Вместо {\"name\":\"Иван\",\"address\":{\"city\":\"Москва\"}}\n    \u002F\u002F Получим: {\"name\":\"Иван\",\"city\":\"Москва\"}\n}\n```\n\n\u003C\u002Fdetails>\n\n### Mix-ins для сторонних классов\n\nПозволяют добавить аннотации Jackson к классам, исходный код которых нельзя изменить.\n\n```java\n\u002F\u002F Mix-in — абстрактный класс с аннотациями\npublic abstract class ThirdPartyUserMixin {\n    @JsonProperty(\"username\")\n    abstract String getName();\n\n    @JsonIgnore\n    abstract String getSecret();\n}\n\n\u002F\u002F Регистрация\nmapper.addMixIn(ThirdPartyUser.class, ThirdPartyUserMixin.class);\n```\n\n### Частые ошибки\n\n- Забытая `@JsonProperty` в параметрах `@JsonCreator` — Jackson не знает, какой JSON-параметр передать в какой аргумент\n- `@JsonUnwrapped` не работает с коллекциями и `Map` — только с POJO\n- Конфликт `@JsonValue` с другими аннотациями — `@JsonValue` определяет единственное представление объекта\n\n> **На собеседовании:** назовите `StdSerializer`\u002F`StdDeserializer`, `@JsonCreator` для иммутабельных объектов и mix-ins для сторонних классов. Java `record`-классы (16+) поддерживаются Jackson из коробки, что делает `@JsonCreator` менее нужным для простых DTO.","","middle",[15],"serialization",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Как кастомизировать сериализацию в Jackson? — Gymterview","Jackson предоставляет несколько механизмов кастомизации: пользовательские сериализаторы\u002Fдесериализаторы, аннотации для управления созданием объектов и mix-ins д","Jackson предоставляет несколько механизмов кастомизации: пользовательские сериализаторы\u002Fдесериализаторы, аннотации для у",[15,13],"Jackson предоставляет несколько механизмов кастомизации: пользовательские сериализаторы\u002Fдесериализаторы, аннотации для управления созданием объектов и mix-ins для работы с классами, которые нельзя модифицировать.",true]