2014-09-29 2 views
1

Прежде всего название может быть не самым лучшим. Не стесняйтесь редактировать.Jackson получает непосредственно вложенный список как POJO

Проблема: Если предположить, что это JSON (цитата не хватает, я знаю):

{ 
    meta: { 
     code: 200 
    }, 
    response: { 
     suggestedFilters: { }, 
     suggestedRadius: 922, 
     headerLocation: "New York", 
     headerFullLocation: "New York", 
     headerLocationGranularity: "city", 
     totalResults: 246, 
     groups: [ 
      { 
       type: "Recommended Places", 
       name: "recommended", 
       items: [ 
        { 
         // item I care 
        }, 
        { 
         // item I care 
        } 
       ] 
      } 
     ] 
    } 
} 

Нужно пройти весь путь в POJO? Например теперь мой класс:

@JsonIgnoreProperties(ignoreUnknown = true) 
public class MyVenueResponse { 

    private VenueResponse response; 
    public VenueResponse getResponse() { 
     return response; 
    } 

    public class VenueResponse{ 

     private List<VenueGroup> groups; 
     public List<VenueGroup> getGroups() { 
      return groups; 
     } 
    } 

    public class VenueGroup { 

     private ArrayList<GroupItems> items; 
     public ArrayList<GroupItems> getItems() { 
      return items; 
     } 

    } 

} 

Я действительно не заботятся обо всех средних классов, но только о public ArrayList<GroupItems> getItems(). Есть ли способ «ускорить» процесс и сказать Джексону пропустить «ответ» и начать с объекта groups или не знает, как его отобразить?

Обратите внимание, что я использую databind как:

objectMapper.readValue(body.charStream(), MyVenueResponse.class); // where body is a ResponseBody from OKHttp 

ответ

2

Вы можете пройти входной JSON до определенной точки, используя the Jackson Tree API, а затем преобразовать суб дерево в объект Java. Вот пример:

public class JacksonNestedList { 
    public final static String JSON = "{\n" 
      + " meta: {\n" 
      + "  code: 200\n" 
      + " },\n" 
      + " response: {\n" 
      + "  suggestedFilters: { },\n" 
      + "  suggestedRadius: 922,\n" 
      + "  headerLocation: \"New York\",\n" 
      + "  headerFullLocation: \"New York\",\n" 
      + "  headerLocationGranularity: \"city\",\n" 
      + "  totalResults: 246,\n" 
      + "  groups: [\n" 
      + "   {\n" 
      + "    type: \"Recommended Places\",\n" 
      + "    name: \"recommended\",\n" 
      + "    items: [\n" 
      + "     {\n" 
      + "      key: \"value1\"\n" 
      + "     },\n" 
      + "     {\n" 
      + "      key: \"value2\"\n" 
      + "     }\n" 
      + "    ]\n" 
      + "   }\n" 
      + "  ]\n" 
      + " }\n" 
      + "}"; 

    public static class GroupItem { 
     public String key; 

     @Override 
     public String toString() { 
      return "key:" + key; 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     final ObjectMapper mapper = new ObjectMapper(); 
     mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); 

     final JsonParser items = mapper.readTree(JSON) 
       .path("response") 
       .path("groups") 
       .get(0) 
       .path("items") 
       .traverse(); 
     System.out.println(mapper.readValue(items, new TypeReference<List<GroupItem>>() {})); 
    } 
} 

Выход:

[key:value1, key:value2] 
Смежные вопросы