Как отобразить JSON для Java-объекта, имеющего другую структуру, используя Джексона Mixins

2

Как преобразовать этот json

{
    "name": "abc",
    "city": "xyz"
}

для объекта работника с использованием Jackson mixin

//3rd party class//
public class Employee {
    public String name;
    public Address address;
}

//3rd party class//
public class Address {
    public String city;
}
Теги:
jackson

1 ответ

2
Лучший ответ

Обычно вы должны аннотировать поле address с помощью @JsonUnwrapped который будет развернут при сериализации (и завернут при десериализации). Но поскольку вы не можете изменить свои сторонние классы, вы должны сделать это вместо mixin:

// Mixin for class Employee
abstract class EmployeeMixin {
    @JsonUnwrapped public Address address;
}

Затем создайте модуль, содержащий все ваши "расширения". Это можно сделать с помощью Module подкласса или SimpleModule или путем создания SimpleModule как здесь:

SimpleModule module = new SimpleModule("Employee");
module.setMixInAnnotation(Employee.class, EmployeeMixin.class);

В-третьих, зарегистрируйте модуль с помощью ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);

Наконец, получайте удовольствие от сериализации/десериализации!


Самостоятельный, полный пример, что подклассы SimpleModule:

public class TestJacksonMixin {

    /* 3rd party */
    public static class Employee {
        public String name;
        public Address address;
    }

    /* 3rd party */
    public static class Address {
        public String city;
    }

    /* Jackon Module for Employee */
    public static class EmployeeModule extends SimpleModule {
        abstract class EmployeeMixin {
            @JsonUnwrapped
            public Address address;
        }

        public EmployeeModule() {
            super("Employee");
        }

        @Override
        public void setupModule(SetupContext context) {
            setMixInAnnotation(Employee.class, EmployeeMixin.class);
        }
    }

    public static void main(String[] args) throws JsonProcessingException {
        Employee emp = new Employee();
        emp.name = "Bob";
        emp.address = new Address();
        emp.address.city = "New York";

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new EmployeeModule());

        System.out.println(mapper.writeValueAsString(emp));
    }
}

См. Аннотации Джексона

Ещё вопросы

Сообщество Overcoder
Наверх
Меню