如何使用Gson使用相同的json键解析JSONArray和JSONObject?

时间:2018-09-20 05:07:07

标签: android arrays json gson jsonexception

我需要使用Gson将json字符串解析为Java对象(即产品)。这是我的问题:在两种情况下,产品的json字符串将包含Items(即json数组)的列表或仅包含具有相同json键的Item(即json对象)。如何在Product类中声明项目变量以进行如下分析?如果我声明列表,那么它在对象情况下将失败,反之亦然。

public class Product {

@SerializedName("item-content")
@Expose
private List<Item> itemsContent = null;

  //OR 
@SerializedName("item-content")
@Expose
private Item itemContent = null;

}

这是我如何使用gson将json转换为模型。

public static <T> T getJavaObjectFromJsonString(String jsonString, Class<T> class1) {
    T obj = null;
    try {
        obj = getGsonInstance().fromJson(jsonString, class1);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return obj;
}

public static Gson getGsonInstance() {
    if (gson == null) {
        gson = new GsonBuilder().setLenient().create();
    }
    return gson;
}

2 个答案:

答案 0 :(得分:0)

您必须使用Gson自定义解析器:

public class Product implements JsonDeserializer<Product> {
    private List<Item> itemsContent = null;
    private Item itemContent = null;

    @Override
    public Product deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();
        Gson gson = new GsonBuilder().create();
        Product product = new Product();
        JsonElement itemsContent = jsonObject.get("item-content");
        if (itemsContent.isJsonObject()) this.itemsContent = gson.fromJson(itemContent, Item.class);
        else this.itemContent = gson.fromJson(itemsContent, new TypeToken<List<Item>>(){}.getType());
        return product;
    }
}

然后解析您的产品对象,如下所示:

new GsonBuilder().registerTypeAdapter(Product.class, new Product()).create().fromJson(response.toString(), Product.class);

答案 1 :(得分:-1)

  

导入com.google.gson.JsonObject;

     

导入com.google.gson.JsonParser;

     

JsonParser jsonParser =新的JsonParser();

     

JsonObject jsonObj =(JsonObject)jsonParser.parse(retValue); // retValue = JSONObject

您为什么不使用Gson的JsonParser?