这里遇到一个比较棘手的问题,原来项目中使用的不是Gson,客户端在请求json数据时如果没有具体的数据内容会返回空字符串,如:
{"result":{"errorMessage":"用户名/密码错误","errorCode":0},"data":""}
这里的data是表示没有具体的数据,但是在Gson解析时我们用来接受的数据却是具体的实体对象,bean定义如下:
public class Result<T extends BaseEntity> implements Serializable {
private static final long serialVersionUID = -645821020648740998L;
private Status result;
private T data;
public Status getResult() {
return result;
}
public void setResult(Status result) {
this.result = result;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
所以这里在解析的时候就会报一个错误,大体内容是:解析到了一个String,但期望的是一个对象,start with ‘{’,也就是说我们的json应该是下面这种的:
{"result":{"errorMessage":"用户名/密码错误","errorCode":0},"data":null}
或者没有data,
{"result":{"errorMessage":"用户名/密码错误","errorCode":0}}
这里无法修改服务端的代码,所以只能在客户端对获取的数据进行转换,转换的方法是:
JsonObject obj = new JsonParser().parse(json_str).getAsJsonObject();
if (obj.get("data").toString().equals("\"\"")){
obj.remove("data");
}
Result<User> result;
Gson _g = new GsonBuilder().serializeNulls().create();
result = _g.fromJson(obj,new TypeToken<Result<User>>(){}.getType());
通过一个中间对象,JsonObject将data为空的json去除掉相应的data项。
详见参考JsonElement使用。