Java 类Group字段如下
public class Group {
private String _id;
private String name;
private String creator;
private User[] members;//private String[] members
//setter and getter
// ...
}
User类字段如下:
public class User {
private String userName;
private String displayName;
private String status = "";
private String telephone;
//getter and setter
//...
}
其中members字段原本是String[]类型 , 后来改为User[],但是后台数据库已经存储了String[]类型的数据,所以如果简单的通过gson.fromJson()解析,当遇到String[]类型的members时一定会爆出异常崩溃。那这个问题有没有解决的办法呢?当然有。
那就是使用TypeAdapter, 将原来String 类型的 members字段成为 User类的一个成员变量的值。代码如下
final Gson gson=new GsonBuilder().registerTypeAdapter(User.class, new TypeAdapter<User>() {
@Override
public void write(JsonWriter jsonWriter, User user) throws IOException {
if(user != null) {
jsonWriter.value(user.toString());
}
}
@Override
public User read(JsonReader jsonReader) throws IOException {
if(jsonReader.hasNext()) {
if(jsonReader.peek() == JsonToken.STRING) {
User user = new User();
user.setUserName(jsonReader.nextString());
return user;
} else if(jsonReader.peek() == JsonToken.BEGIN_OBJECT) {
User user = new User();
jsonReader.beginObject();
while(jsonReader.hasNext()) {
String name = jsonReader.nextName();
switch (name) {
case "userName":
user.setUserName(jsonReader.nextString());
break;
case "displayName":
user.setDisplayName(jsonReader.nextString());
break;
case "telephone":
user.setTelephone(jsonReader.nextString());
break;
default:
jsonReader.skipValue();
break;
}
}
jsonReader.endObject();
return user;
}
return null;
}
return null;
}
}).create();
qgr = gson.fromJson(result, Res_QueryGroup.class);
主要在于read方法,将原来String[]类型的members使之成为User类的一个字段的值,从而解决了问题。
网友评论