gson真好用

先附个链接:http://www.jianshu.com/p/e740196225a4

先上user类

public class User {
    public String name;
    public int age;

    //objjson互转时候,属性名也可以是mail_adress
    @SerializedName("email_address")

    //@SerializedName(value = "emailAddress", alternate = {"email", "email_address"})
    //这一行是为emailAddress设置别名,当上面的三个属性(email_addressemailemailAddress)都中出现任意一个时均可以得到正确的结果。
    //注:当多种情况同时出时,以最后一个出现的值为准。
    public String emailAddress;
    ...
}

一、Gson的基本用法

        Gson gson = new Gson();

        //基本类型的解析
        int i = gson.fromJson("100", int.class); //100
        double d = gson.fromJson("\"99.99\"", double.class); //99.99
        boolean b = gson.fromJson("true", boolean.class); // true
        String str = gson.fromJson("String", String.class); // String

        //POJO类的生成与解析
        User user = new User("怪盗kidou", 245, "guaidao@xiaomi.com");
        String jsonObject = gson.toJson(user);
        
        String jsonString = "{\"name\":\"怪盗kidou\",\"age\":24,\"email_address\":\"emailAddress@xiaomi.com\"}";
        user = gson.fromJson(jsonString, User.class);
        
        //json数组和List
        String jsonStringArr = "[{\"name\":\"怪盗kidou\",\"age\":24,\"email_address\":\"emailAddress@xiaomi.com\"},{\"name\":\"怪盗kidou1\",\"age\":25,\"email_address\":\"emailAddress1@xiaomi.com\"}]";
        User[] uers = gson.fromJson(jsonStringArr, User[].class);
        List<User> userList = gson.fromJson(jsonStringArr, new TypeToken<List<User>>() {
        }.getType());
        
        //jsonmap
        String mapJson = "{\"name\":\"怪盗kidou\",\"age\":24,\"email_address\":\"emailAddress@xiaomi.com\"}";
        Map<String, String> map = gson.fromJson(mapJson, Map.class);
//        也可以下面这样写,这样写的意思是防止范型擦除
//        Map<String, String> map = gson.fromJson(mapJson, new TypeToken<Map<String,String>>(){}.getType());
         

二、手动转json字符串

  
//手动jsonmap对象
String json = "{\"name\":\"怪盗kidou\",\"age\":\"24\"}";
user = new User();
JsonReader reader = new JsonReader(new StringReader(json));
reader.beginObject();
while (reader.hasNext()) {
    String s = reader.nextName();
    switch (s) {
        case "name":
            user.name = reader.nextString();
            break;
        case "age":
            user.age = reader.nextInt(); //自动转换 break; case "email": user.email = reader.nextString(); break; } } reader.endObject(); // throws IOException


    }
}
reader.endObject();

三、Gson的高级用法:使用GsonBuilder定制

 
//使用GsonBuilder生成定制的gson

final List<String> ignoreFields = Arrays.asList(new String[]{"name"});
gson = new GsonBuilder()
        .serializeNulls()  //序列化null
        .setDateFormat("yyyy-MM-dd") // 设置日期时间格式,另有2个重载方法 // 在序列化和反序化时均生效
        .disableInnerClassSerialization() // 禁此序列化内部类
        .generateNonExecutableJson() //生成不可执行的Json(多了 )]}' 4个字符)
        .disableHtmlEscaping() //禁止转义html标签
        .setPrettyPrinting()//格式化输出
        .excludeFieldsWithoutExposeAnnotation()//根据@Expose决定是否过滤字段
        .setExclusionStrategies(new ExclusionStrategy() {
            //下面两个函数一个是过滤字段,一个是过滤类,返回true过滤,返回false不过滤
                //其中  ignoreFileds是要过滤的字段集合
            @Override
            public boolean shouldSkipField(FieldAttributes fieldAttributes) {
                return ignoreFields.contains(fieldAttributes.getName());
            }

            @Override
            public boolean shouldSkipClass(Class<?> clazz) {
                return clazz.getName().equals(Date.class.getName());
            }
        })//序列化和反序列化时属性字段的别名,
        .setFieldNamingStrategy(new FieldNamingStrategy() {
            @Override
            public String translateName(Field field) {
                if (field.getName().equals("emailAddress"))
                    return "email_address";
                else
                    return field.getName();
            }
        })
        .create();
//注意,下面的必须使用GsonBuilder.excludeFieldsWithoutExposeAnnotation().create()生成的gson才有效
//@Expose // 需要导出的字段加,不导出的字段不加
//@Expose(deserialize = true,serialize = true) //序列化和反序列化都都生效,等价于上一条
//@Expose(deserialize = true,serialize = false) //反序列化时生效
//@Expose(deserialize = false,serialize = true) //序列化时生效
//@Expose(deserialize = false,serialize = false) // 和不写注解一样


//下面是最NBTypeAdapter,可以接管序列化和发序列化的过程!!!
//使用方法是,写一个继承自TypeAdapter的范型类
gson = new GsonBuilder().registerTypeAdapter(User.class, new UserTypeAdapter()).create();
String adapterString = "{\"name\":\"怪盗kidou\",\"age\":24,\"email_address\":\"emailAddress@xiaomi.com\"}";
user = gson.fromJson(adapterString, User.class);
System.out.println(user);年龄是24+10
adapterString = gson.toJson(user);
System.out.println(adapterString);年龄是34+10

//当然如果TypeAdapter如果配合@JsonAdapter(UserTypeAdapter.class)这个加在类的上注解使用就完美了!
//放在类上后就可以用Gson gson=new Gson()就可以完美使用了!!!
public class UserTypeAdapter extends TypeAdapter<User> {
    @Override
    public void write(JsonWriter jsonWriter, User user) throws IOException {
        //objjson
        jsonWriter.beginObject();
        jsonWriter.name("name").value(user.name);
        //让年龄大10岁!
        jsonWriter.name("age").value(user.age + 10);
        jsonWriter.name("email").value(user.emailAddress);
        jsonWriter.endObject();
    }

    @Override
    public User read(JsonReader jsonReader) throws IOException {
        //jsonobj
        User user = new User();
        jsonReader.beginObject();
        while (jsonReader.hasNext()) {
            switch (jsonReader.nextName()) {
                case "name":
                    user.name = jsonReader.nextString();
                    break;
                case "age":
                    user.age = jsonReader.nextInt() + 10;
                    break;
                case "email":
                case "email_address":
                case "emailAddress":
                    user.emailAddress = jsonReader.nextString();
                    break;
            }
        }
        jsonReader.endObject();
        return user;
    }
}

四、过滤字段的方法(第二个最常用)

1.使用GsonBuilder.excludeFieldsWithoutExposeAnnotation()//根据@Expose决定是否过滤字段

2.使用GsonBuilder.setExclusionStrategies(new ExclusionStrategy() {

                    //下面两个函数一个是过滤字段,一个是过滤类,返回true过滤,返回false不过滤

                    //ignoreField是要过滤字段的集合list

                    @Override
                    public boolean shouldSkipField(FieldAttributes fieldAttributes) {
                        return ignoreFields.contains(fieldAttributes.getName());
                    }

                    @Override
                    public boolean shouldSkipClass(Class<?> clazz) {
                        return clazz.getName().equals(Date.class.getName());
                    }

                })


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值