Джексон десериализация json, игнорировать корневой элемент из json

Как игнорировать родительский тег из json ??

Вот мой json

String str = "{\"parent\": {\"a\":{\"id\": 10, \"name\":\"Foo\"}}}";

А вот класс, который будет отображен из json.

public class RootWrapper {
  private List<Foo> foos;

  public List<Foo> getFoos() {
    return foos;
  }

  @JsonProperty("a")
  public void setFoos(List<Foo> foos) {
    this.foos = foos;
  }
 }

Вот тест открытый класс JacksonTest {

@Test
public void wrapRootValue() throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true);
    mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    String str = "{\"parent\": {\"a\":{\"id\": 10, \"name\":\"Foo\"}}}";

    RootWrapper root = mapper.readValue(str, RootWrapper.class);

    Assert.assertNotNull(root);
}

Я получаю сообщение об ошибке ::

 org.codehaus.jackson.map.JsonMappingException: Root name 'parent' does not match expected ('RootWrapper') for type [simple type, class MavenProjectGroup.mavenProjectArtifact.RootWrapper]

Я нашел решение, данное аннотацией Джексона ::

  (a) Annotate you class as below

  @JsonRootName(value = "parent")
  public class RootWrapper {

  (b) It will only work if and only if ObjectMapper is asked to wrap.
    ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true);

Job Done !!

Еще одна проблема с методом десериализации Джексона: (

если 'DeserializationConfig.Feature.UNWRAP_ROOT_VALUE настроен', он разворачивает все jsons, даже если мой класс не аннотирован @JsonRootName (value = "rootTagInJson"), не weired.

Я хочу развернуть корневой тег, только если класс аннотирован @JsonRootName, в противном случае не развертывайте.

Итак, ниже показан вариант использования для развертывания корневого тега.

  ###########################################################
     Unwrap only if the class is annotated with @JsonRootName.
  ############################################################

Я сделал небольшое изменение в ObjectMapper исходного кода Джексона и создал новую версию jar. 1. Поместите этот метод в ObjectMapper

// Ash:: Wrap json if the class being deserialized, are annotated
// with @JsonRootName else do not wrap.
private boolean hasJsonRootName(JavaType valueType) {
    if (valueType.getRawClass() == null)
        return false;

    Annotation rootAnnotation =  valueType.getRawClass().getAnnotation(JsonRootName.class);
    return rootAnnotation != null;
}


    2. Edit ObjectMapper method :: 
    Replace 
       cfg.isEnabled(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE)
    with
       hasJsonRootName(valueType)

    3. Build your jar file and use it.
37
задан Ash 13 January 2012 в 13:13
поделиться