Json响应的Gson解析器类 - Android

时间:2014-07-09 09:47:29

标签: android gson

我得到的反应如下,

有时语言标记带有数组值

{
    "name": "Tony",
    "id":"123",
    "language":["en","fr" ]
}

对于某些用户,语言值带有字符串值。

{
    "name": "Max",
    "id":"124",
    "language":"en"
}

如何创建解析器类以使用GSON解析json响应?

3 个答案:

答案 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;
    }
}