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