我得到的反应如下,
有时语言标记带有数组值
{
"name": "Tony",
"id":"123",
"language":["en","fr" ]
}
对于某些用户,语言值带有字符串值。
{
"name": "Max",
"id":"124",
"language":"en"
}
如何创建解析器类以使用GSON解析json响应?
答案 0 :(得分:0)
从概念上讲,这不是一个有效的JSON。应该在第一时间确定“语言”的类型。
如果您在某些情况下发送语言列表,则在其他情况下很容易发送一个元素列表。
{
"name": "Max",
"id":"124",
"language":["en"]
}
另一方面,如果没有办法以正确的方式解决这个问题,你可以使用这个工作环境。
public class Model {
private String name;
private int id;
}
public class ModelWithLanguageString extends Model{
private String language;
}
...
public class ModelWithLanguageArray extends Model{
private List<String> language;
}
然后在你的解析器中
Gson gson = new Gson();
Model model;
try{
model = gson.fromJson(response, ModelWithLanguageString.class);
}catch(JSONParserException e){
model = gson.fromJson(response, ModelWithLanguageArray.class);
}
使用此解决方案可能会在代码中出现一些出现问题。
答案 1 :(得分:0)
这可能不是直接答案,但您可以使用 Jackson Parser 处理/实现,而不需要try catch
。通过设置 objectmapper 属性。
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
很少有其他对象映射器你应该设置,
objectMapper.setSerializationInclusion(Include.NON_NULL);
objectMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
<强> GetDetails.java 强>
package com.domain.project;
import java.util.List;
public class GetDetails{
private String id;
private List<String> language;
private String name;
public String getId(){
return this.id;
}
public void setId(String id){
this.id = id;
}
public List<String> getLanguage(){
return this.language;
}
public void setLanguage(List<String> language){
this.language = language;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
}
传递解析响应。
GetDetails mDetails = objectMapper.readValue(response, GetDetails.class)
获取价值。
String mName = mDetails.getName(); // Name
String id = mDetails.getId(); // ID
// Language
int mLangSize = mDetails.getLanguage().size();
for (int i = 0; i < mLangSize; i++) {
System.out.println("\nLang : " + mDetails.getLanguage().get(i).toString());
}
以上将同时接受数组&amp; 语言键中的字符串。
{
"name": "Tony",
"id":"123",
"language":["en","fr" ]
}
{
"name": "Tony",
"id":"123",
"language":"en"
}
最后一个小提示,使用http://jsongen.byingtondesign.com/生成pojo类,当数组中有一个数组,只需要很少的修改,你就可以快速获得所有pojo类。
答案 2 :(得分:0)
如果您使用的是GSON库,请尝试使用
public class ResponseBean implement serializable {
@SerializedName("name")
private String name;
@SerializedName("id")
private String id;
@SerializedName("language")
private List<Language> language;
public class Language{
@SerializedName("0")
private String en;
@SerializedName("1")
private String fr;
}
}