Джерси (+Джексон) сериализация

Я использую платформу Джерси с com.fasterxml.jackson в качестве сериализатора по умолчанию. Я пытаюсь вернуть объект json с указанным корневым именем. например.:

{
  "rootName": {
                "key":"value"
              }
}

Вопрос в том, как включить перенос на корневом уровне, чтобы я мог использовать аннотацию @JsonRootName?

На данный момент я использую оболочку класса rootName, чтобы получить то, что мне нужно, однако я считаю, что где-то есть более общие настройки... обертывание объекта в другой объект-оболочку только для того, чтобы получить его корневое имя на выходе, кажется, не лучшее решение для меня. Если бы вы могли указать мне на лучшее решение, было бы здорово.

Спасибо за помощь, ПП


person ppacxnet    schedule 27.05.2014    source источник


Ответы (1)


Чтобы использовать аннотацию @JsonRootName, вам необходимо включить функции SerializationFeature.WRAP_ROOT_VALUE и/или DeserializationFeature.UNWRAP_ROOT_VALUE. Вот пример:

public class JacksonWrapped {

    final static String JSON = "{\n" +
            "  \"rootName\": {\n" +
            "                \"key\":\"value\"\n" +
            "              }\n" +
            "}";

    @JsonRootName("rootName")
    public static class Thing {
        public final String key;

        @JsonCreator
        public Thing(@JsonProperty("key") String key) {
            this.key = key;
        }

        @Override
        public String toString() {
            return "Thing{" +
                    "key='" + key + '\'' +
                    '}';
        }
    }

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
        mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
        System.out.println(mapper.writeValueAsString(new Thing("value")));
        System.out.println(mapper.readValue(JSON, Thing.class));
    }
}

Выход:

{"rootName":{"key":"value"}}
Thing{key='value'}

Чтобы он работал в реализации JAX-RS, вам необходимо настроить JSON-поставщика JAX-RS. Есть несколько способов добиться этого. Один из вариантов — зарегистрировать преобразователь контекста для сопоставителя объектов, как здесь. Другой вариант аннотировать методы ресурсов с помощью аннотации @JacksonFeatures следующим образом:

@GET
@JacksonFeatures(serializationEnable = SerializationFeature.WRAP_ROOT_VALUE,
        deserializationEnable = DeserializationFeature.UNWRAP_ROOT_VALUE)
public Thing resourceMethod() {
    ...    
}
person Alexey Gavrilov    schedule 28.05.2014