2012-06-19 5 views
7

Я использую Jackson в CXF для сериализации/десериализации данных. К сожалению, мне сложно настроить CXF/Jackson для десериализации массива JSON. Я был бы признателен за помощь в решении этой проблемы.Как десериализовать массив JSON?

До сих пор большая часть данных JSon была в формате объекта, т.е.

{ "objectCollection": [ {...}, {...}, {...}... ] }

Однако данные JSON в вопросе имеет вид:

[ {...}, {...}, {...} ]

Конечная точка веб-службы ожидает объект «GroupDto» (см. Ниже) , который имеет одно свойство - набор групп, который является , переданный через t он массив JSON.

@PATH(...) 
public Response createGroups(GroupsDto groups) { 
... 
} 

Я добавил @JsonDeserialize следующим образом к свойству коллекции GroupsDto, но он НЕ работает. Я по-прежнему получаю: «Не могу десериализацию экземпляра GroupsDto из маркеров START_ARRAY»

public class GroupsDto { 

     private Collection<GroupDto> groups; 

     /** 
     * @return the groups 
     */ 
     @XmlElement(name="group") 
     @JsonDeserialize(contentAs=GroupDto.class) 
     public Collection<GroupDto> getGroups() { 
       return groups; 
     } 
... 
} 
+0

Проверить этот вопрос [Джексон - читает массив JSON с использованием Robospice loadDataFromNetwork() метод] [1] [1]: http://stackoverflow.com/questions/18792702/jackson-reading- a-json-array-with-robospice-using-loaddatafromnetwork-method – Sneg

ответ

0

Вам просто нужно указать @JsonDeserialize(contentAs=GroupDto.class) в вашем сеттере. Сериализация всегда на get desserialization всегда на , или если вы предпочитаете, вы можете указать как на поле.

Документация для Serialize и Deserialize

Код образца:

import java.io.IOException; 
import java.util.List; 

import org.codehaus.jackson.JsonGenerationException; 
import org.codehaus.jackson.map.JsonMappingException; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.annotate.JsonDeserialize; 

public class JacksonDeserialize { 

    public static class ModelClass { 

     private String name; 

     public ModelClass() { 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(final String name) { 
      this.name = name; 
     } 

     public ModelClass(final String name) { 
      super(); 
      this.name = name; 
     } 

     @Override 
     public String toString() { 
      return "ModelClass [name=" + name + "]"; 
     } 

    } 

    public static class ListModelClass { 

     private List<ModelClass> list; 

     @JsonDeserialize(contentAs = ModelClass.class) 
     public void setList(final List<ModelClass> list) { 
      this.list = list; 
     } 

     @Override 
     public String toString() { 
      return "ListModelClass [list=" + list + "]"; 
     } 

    } 

    public static void main(final String[] args) throws JsonGenerationException, JsonMappingException, IOException { 
     ObjectMapper objectMapper = new ObjectMapper(); 
     System.out.println(objectMapper.readValue("{\"list\":[{\"name\":\"name1\"},{\"name\":\"name2\"}]}", 
       ListModelClass.class)); 
    } 

} 
+0

Спасибо за хедз-ап по проблеме getter/setter. Я заметил в вашем примере, что вы квалифицируете json-массив, то есть «{\" * list * \ ": ...} Можно ли десериализовать * без * квалификации? Если да, то как? – Ari

+0

не существует квалификации, в этом случае магия выполняется аннотацией '@ JsonDeserialize'. Свойство' contentAs' должно указывать на то, что это коллекция, и будет десериализован как «ModelClass». Если вы хотите, вы можете изменить имя свойства из 'list' в –

+0

Я понимаю, что конкретное имя несущественно, но что он делает в случае, когда нет имени? В вашем примере вы читаете в '{ «list»: [...]} ', который имеет ключ« list », но что, если нет ключа (name) - т.е.' [...] '? – Ari

8

Если JSON данные формы:

[ {...}, {...}, {...} ] 

Вы должны использовать добавить еще один класс сказать 'обертка':

@JsonIgnoreProperties(ignoreUnknown = true) 
public class ListDto extends ArrayList<GroupDto> { 

    public ListDto() { 
    } 
} 

И используйте этот класс в то время как deserailizing. Этот подход работал для меня.

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