2014-10-12 4 views
2

Мои REST службы RESPONS со следующими данными:Анализировать анонимный массив из JSON результата с Google HTTP библиотеки Клиент

[ 
    { 
     "name": "Bart", 
     "age": 10 
    }, 
    { 
     "name": "Homer", 
     "age": 42 
    }, 
    { 
     "name": "Marjorie", 
     "age": 34 
    } 
] 

Результирующий набор представляет собой массив объектов, которые я хочу, чтобы автоматически анализировать с помощью библиотеки HTTP Client Google. Поэтому я создал SimpsonResult и Simpson класс:

SimpsonResult.java

public class SimpsonResult { 

    private List<Simpson> simpsons; 

    public SimpsonResult() { 
    } 

    public List<Simpson> getSimpsons() { 
    return simpsons; 
    } 

    public void setSimpsons(List<Simpson> simpsons) { 
    this.simpsons = simpsons; 
    } 

} 

Simpson.java

public class Simpson { 

    @Key 
    private String name; 

    @Key 
    private int age; 

    public Simpson() { 
    } 

    public String getName() { 
    return name; 
    } 

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

    public int getAge() { 
    return age; 
    } 

    public void setAge(int age) { 
    this.age = age; 
    } 

} 

Теперь я хочу, чтобы запросить мой бэкенд и автоматически отображать ответ в a SimpsonResult. Поэтому я написал следующий код:

@Override 
public SimpsonResult loadDataFromNetwork() throws IOException { 
    HttpRequestFactory requestFactory = getHttpRequestFactory(); 
    GenericUrl url = new GenericUrl(baseUrl); 
    HttpRequest request = requestFactory.buildGetRequest(url); 
    request.setParser(new JacksonFactory().createJsonObjectParser()); 
    return request.execute().parseAs(SimpsonResult.class); 
} 

Но когда я выполняю код, то я получаю исключение парсера из com.google.api.client.json.JsonParser.

Когда я сопоставляю его в строку (request.execute().parseAsString()), то он работает.

Итак, я считаю, что моя декларация о сопоставлении неверна?

+0

анализ как POJO будет означать корень JSON является объект JSON с помощью ключа под названием Симпсоны со значением, которое является массивом JSON. Ваш корневой JSON является массивом JSON. –

+0

Так что я не могу использовать 'createJsonObjectParser'? –

+0

Я вообще не знаю эту библиотеку. (Я знаю Джексона). Ваш целевой тип Java должен соответствовать JSON. Для массива JSON это должно быть «Collection» или тип массива. –

ответ

1

Вы можете использовать Тип для разбора параметризованных классов, как показано ниже

Type type = new TypeToken<ArrayList<SimpsonResult>>() {}.getType(); 
request.execute().parseAs(type); 

Создание дополнительный класс, простирающийся параметризованные классы, как ArrayList, только для синтаксического анализа является не рекомендуется. Следовательно, ваша функция может быть записана в виде

@Override 
public ArrayList<SimpsonResult> loadDataFromNetwork() throws IOException { 
    HttpRequestFactory requestFactory = getHttpRequestFactory(); 
    GenericUrl url = new GenericUrl(baseUrl); 
    HttpRequest request = requestFactory.buildGetRequest(url); 

    Type type = new TypeToken<ArrayList<SimpsonResult>>() {}.getType(); 
    return request.execute().parseAs(type); 
} 
2

То, как вы это делаете, недействительно. Для SimpsonResult требуется поле с именем simpsons, и в вашем json нет такого поля.

Как используя общие типы коллекций немного сложнее в большинстве рамок, что я делаю, как правило, для этого, чтобы создать простой тип списка внутри Simpson класса:

public class Simpson { 

    public static class List extends ArrayList<Simpson> { 
    } 

    ... //you simpson code 
} 

Вы можете использовать Simpson.List разобрать ваш JSON через аннотации.

0

Попробуйте это ..

@Override 
public Simpson[] loadDataFromNetwork() throws IOException { 
HttpRequestFactory requestFactory = getHttpRequestFactory(); 
GenericUrl url = new GenericUrl(baseUrl); 
HttpRequest request = requestFactory.buildGetRequest(url); 
request.setParser(new JacksonFactory().createJsonObjectParser()); 
return request.execute().parseAs(Simpson[].class); 
} 

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

  • Нет связанных вопросов^_^