Gson解析之使用TypeAdapter避免json字符串与ja

2019-10-10  本文已影响0人  岁月神偷_4676

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类的一个字段的值,从而解决了问题。

上一篇下一篇

猜你喜欢

热点阅读