2013-12-08 4 views
1

У меня возникли проблемы с моим проектом Spring MVC, который включает использование API для получения фактов питания. Я продолжаю получать вложенное исключение: java.lang.IllegalArgumentException: несоответствие типа аргумента. Ниже приведен ответ JSON и классы, которые я создал для процесса десериализации.Deserialization of JSON, Несоответствие

public FullResponse search() throws ClientProtocolException, IOException{ 

    CloseableHttpClient client = HttpClients.createDefault(); 
    HttpGet getProducts = new HttpGet("https://api.nutritionix.com/v1_1/search/"+ value +"?results=0%3A6&cal_min=0&cal_max=50000&fields=item_name%2Citem_id&appId=ac23ceb3&appKey=API_KEY"); 
    CloseableHttpResponse productResponse = client.execute(getProducts); 
    String entityString = EntityUtils.toString(productResponse.getEntity()); 
    FullResponse test = new JSONDeserializer<FullResponse> ().deserialize(entityString,FullResponse.class); 

    return test; 
} 

// Это полный класс ответа

public class FullResponse { 

String total_hits; 
String max_score; 
List<Hits> hits; 

public FullResponse(){ 

} 

public String getTotal_hits() { 
    return total_hits; 
} 

public void setTotal_hits(String total_hits) { 
    this.total_hits = total_hits; 
} 

public String getMax_score() { 
    return max_score; 
} 

public void setMax_score(String max_score) { 
    this.max_score = max_score; 
} 

public List<Hits> getHits() { 
    return hits; 
} 

public void setHits(List<Hits> hits) { 
    this.hits = hits; 
} 

} 

// Это класс хиты я создал

public class Hits { 

    String _index; 
    String _type; 
    String _id; 
    String _score; 
    List<Fields> fields; 

public Hits(){ 

    } 

public String get_index() { 
    return _index; 
} 

public void set_index(String _index) { 
    this._index = _index; 
} 

public String get_type() { 
    return _type; 
} 

public void set_type(String _type) { 
    this._type = _type; 
} 

public String get_id() { 
    return _id; 
} 

public void set_id(String _id) { 
    this._id = _id; 
} 

public String get_score() { 
    return _score; 
} 

public void set_score(String _score) { 
    this._score = _score; 
} 

public List<Fields> getFields() { 
    return fields; 
} 

public void setFields(List<Fields> fields) { 
    this.fields = fields; 
} 


} 

// А это мое поле класса я создал

public class Fields { 

String item_name; 

public Fields(){ 

} 

public String getField(){ 
    return item_name; 
} 
public void setField(String name){ 
    item_name=name; 
} 
} 

Любые идеи о том, что такое goi Это было бы огромной помощью.

Вот JSON из запроса

{ 
"total_hits":11025, 
"max_score":11.122117, 
"hits":[{ 
"_index":"nixproductionv13", 
"_type":"item", 
"_id":"513fceb375b8dbbc210000e4", 
"_score":11.122117, 
"fields":{"item_name":"Whole Milk - 1 tbsp"}}, 

{"_index":"nixproductionv13", 
"_type":"item", 
"_id":"513fceb375b8dbbc2100017b", 
"_score":10.7038355, 
"fields":{"item_name":"2% Milk - 1 cup"}}, 

{"_index":"nixproductionv13", 
"_type":"item", 
"_id":"513fceb375b8dbbc210000f3", 
"_score":10.7038355, 
"fields":{"item_name":"1% Milk - 1 cup"}}, 

{"_index":"nixproductionv13", 
"_type":"item", 
"_id":"513fceb375b8dbbc210000fb", 
"_score":10.689078, 
"fields":{"item_name":"Skim Milk - 1 cup"}}, 

{"_index":"nixproductionv13", 
"_type":"item", 
"_id":"513fceb375b8dbbc210000e3", 
"_score":10.65872, 
"fields":{"item_name":"Whole Milk - 1 fl oz"}}, 

{"_index":"nixproductionv13", 
"_type":"item", 
"_id":"513fceb375b8dbbc2100017a", 
"_score":10.392, 
"fields":{"item_name":"2% Milk - 1 quart"}}]} 
+0

Просьба выслать полную статистику стека –

ответ

0

Я не знаю, flexjson очень хорошо, но мне кажется, что это не нравится преобразование из JSON числовых полей Java String полей. Ошибка происходит, например, при попытке десериализации этого JSON номера

"_score":10.7038355 

в этом Java String поля

String _score; 

Если изменить все String поля, которые имеют соответствующие JSON числовых полей в поля типа Double, ваш код будет работать.

Также обратите внимание, что объект fields JSON

"fields":{"item_name":"Whole Milk - 1 tbsp"}}, 

является объектом JSON, а не массив JSON. Поэтому вам нужно изменить

List<Fields> fields; 

в

Fields fields; 

и соответственно также изменить методы получения и установки.


В качестве альтернативы, вы можете использовать другой формат JSON синтаксического анализа библиотеки, как Gson, которая поддерживает эти стандартные преобразования типов просто отлично.

+0

Любые идеи, почему это все равно будет десериализоваться и приведет к нулевым именам продуктов? – user3080107

+1

@ user3080107 Да, вы должны использовать обычные имена getter и setter, которые соответствуют имени поля. Например, 'setItem_name' и' getItem_name'. Также обратите внимание, что соглашение об именах Java не рекомендует использовать '_' в именах переменных. Ознакомьтесь с [Соглашениями Java Bean] (http://en.wikipedia.org/wiki/JavaBeans), с которыми работают многие библиотеки. –

+0

Причина того, что это имя было вызвано ответом JSON, я думал, что использовал эти имена, иначе он не смог бы сериализовать ответ JSON – user3080107