2012-05-31 5 views
1

JSON ответJAXB JSON Джексон демаршаллинга массив/одноэлементный список

Случай 1: только один элемент существует

{ 
"Person": { 
    "first": "foo", 
    "last": "bar" 
} 
} 

Случай 2: более чем один элемент существует (то есть) соответствующий тип массива

{ 
"Person": [ 
    { 
     "first": "foo", 
     "last": "bar" 
    }, 
    { 
     "first": "cow", 
     "last": "pal" 
    } 
] 
} 

JAXB код, который генерирует выше ответы, которые я не контролирую.

@XmlRootElement 
public class PersonContainer { 

@XmlElement 
List<Person> personList; 
} 

Я использую функцию JAXB Джексона парсера для распаковать в JSON на объект JAXB. Поскольку возможны два типа ответа, парсер Джексона работает неправильно для ответа Case 1.

Как правильно обрабатывать оба случая и связывать ответ JSON?

ответ

1

Похоже на пользовательский код необходим для вышеуказанных случаев

Карта список со следующими

  @JsonDeserialize(using=PersonSerializer.class) 
      List<Person> personList; 

Реализовать PersonSearializer

  public class PersonSerializer extends JsonDeserializer<List<Person>>{ 

public List<Person> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) 
    throws IOException, JsonProcessingException { 
    ObjectCodec oc = jsonParser.getCodec(); 
    JsonNode node = oc.readTree(jsonParser); 
    Iterator<JsonNode> iterator = node.getElements(); 

    List<Person> list = new ArrayList<Person>(); 
    while (iterator.hasNext()){ 
     JsonNode j = iterator.next(); 
     Person nr = new Person(); 
     if (j.get("first") == null) { 
      nr.setFirstName(node.get("first").getTextValue())); 
      nr.setLastName(node.get("last").getTextValue())); 
      list.add(nr); 
      break; 
     } 
     nr.setFirstName(j.get("first").getTextValue())); 
     nr.setLastName(j.get("last").getTextValue())); 
     list.add(nr); 
    } 

    return list; 
} 

}

1

Я нашел Решение: замените JAXB JSON-сериализатор на лучшее поведение JSON-сериализатор, такой как Джексон. Легкий способ - использовать jackson-jaxrs, который уже сделал это для вас. Класс - JacksonJsonProvider. Все, что вам нужно сделать, это отредактировать web.xml вашего проекта, чтобы Джерси (или другая реализация JAX-RS) сканировала его. Вот что вам нужно добавить:

<init-param> 
    <param-name>com.sun.jersey.config.property.packages</param-name> 
    <param-value>your.project.packages;org.codehaus.jackson.jaxrs</param-value> 
</init-param> 

И это все, что нужно. Джексон будет использоваться для сериализации JSON, и он работает так, как вы ожидаете от списков и массивов.

Это работает для меня, убедитесь, что jackson-jaxrs.jar в вашем классе.

Ссылка: How can I customize serialization of a list of JAXB objects to JSON?

Смежные вопросы