Java处理JSON数据 ── Gson的使用

Gson简介

Google Gson是一个简单的基于Java的库,用于将Java对象序列化为JSON,也可以把JSON转换为Java对象。它是Google开发的开源库。

Gson的特点:

  • 易于使用:Gson API提供了一个高级外观,以简化常用用例。 无需创建映射:Gson API为要序列化的大多数对象提供了默认映射。
  • 性能:Gson相当快并且内存占用少。它适用于大型对象或系统。
  • 干净的JSON:Gson创建了干净且紧凑的JSON结果,易于阅读。
  • 无依赖关系:除JDK之外,Gson库不需要任何其他库。
  • 开源:Gson库是开源的;它是免费提供的。

Gson的功能非常齐全,但是性能没有Fastjson快。

Maven依赖:

		<dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.2</version>
        </dependency>

实体类:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User{

    private int id;
    //SerializedName 保留了前端、后台各自的命名习惯,
    //下面注解的意思是两个属性(name_test、name)都中,
    //出现任意一个时均可以得到正确的结果
    @SerializedName(value = "name_test",alternate = {"name"})
    private String name;
    private int age;
}

使用注解后,属性name就变成了name_test,如果不加注解就是name。

在这里插入图片描述

对象转json字符串:

//对象转json字符串
    private static String tojson() {
    	User user = new User(1,"中国1",100);
        Gson gson = new Gson();
        String str = gson.toJson(user);
        System.out.println("对象转json字符串:" + str);
        return str;
    }

json字符串转对象:

private static void fromjson(){
        String str = tojson();
        Gson gson = new Gson();
        User user = gson.fromJson(str,User.class);
        System.out.println(user);
    }

List转json:

private static String tojsonlist(){
		User user = new User(1,"中国1",100);
		User user2 = new User(2,"中国2",200);
		User user3 = new User(3,"中国3",300);
        List list = new ArrayList();
        list.add(user);
        list.add(user2);
        list.add(user3);
        Gson gson = new Gson();
        String str = gson.toJson(list);
        System.out.println(str);
        return str;
    }

json转list:

private static void formjsonlist(){
        String str = tojsonlist();
        Gson gson = new Gson();
        List<User> list = gson.fromJson(str,new TypeToken<List<User>>(){}.getType());
        for (User user : list){
            System.out.println(user);
        }
    }

Set转json:

private static String tojsonset(){
		User user = new User(1,"中国1",100);
		User user2 = new User(2,"中国2",200);
		User user3 = new User(3,"中国3",300);
        Set set = new HashSet();
        set.add(user);
        set.add(user2);
        set.add(user3);
        set.add(user4);
        Gson gson = new Gson();
        String str = gson.toJson(set);
        System.out.println(str);
        return str;
    }

json转set:

private static void formjsonset(){
        String str = tojsonset();
        gson = new GsonBuilder().setPrettyPrinting().create();
        Set<User> set = gson.fromJson(str,new TypeToken<Set<User>>(){}.getType());
        for (User user : set){
            System.out.println(user);
        }
    }

还有另一种常用的注解 @Expose,@Expose提供了两个属性,且都有默认值(默认值是true),开发者可以根据需要设置不同的值。注意: 该注解在使用new Gson() 时是不会发生作用,必须和GsonBuilder的excludeFieldsWithoutExposeAnnotation()配合使用。

GsonBuilder是另一种Gson的创建方式。

Gson gson = new GsonBuilder()
                //序列化null
                //.serializeNulls()
                // 设置日期时间格式,另有2个重载方法
                // 在序列化和反序化时均生效
                //.setDateFormat("yyyy-MM-dd")
                // 禁此序列化内部类
                //.disableInnerClassSerialization()
                //生成不可执行的Json(多了 )]}' 这4个字符)
                //.generateNonExecutableJson()
                //禁止转义html标签
                //.disableHtmlEscaping()
                //格式化输出
                .setPrettyPrinting()
                //与@Expose配合使用
                .excludeFieldsWithoutExposeAnnotation()
                .create();

实体类:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExposeEntity {
//    @Expose(deserialize = true,serialize = true) //序列化和反序列化都都生效,等价于上一条
//    @Expose(deserialize = true,serialize = false) //反序列化时生效
//    @Expose(deserialize = false,serialize = true) //序列化时生效
//    @Expose(deserialize = false,serialize = false) // 和不写注解一样
    @Expose(deserialize = true,serialize = false) //反序列化时生效,序列化时不生效
    private String expose;
    @Expose
    private String name;
    @Expose
    private int age;
}

序列化:

private static String tojson(){
        Gson gson = new GsonBuilder()
                //序列化null
                //.serializeNulls()
                // 设置日期时间格式,另有2个重载方法
                // 在序列化和反序化时均生效
                //.setDateFormat("yyyy-MM-dd")
                // 禁此序列化内部类
                //.disableInnerClassSerialization()
                //生成不可执行的Json(多了 )]}' 这4个字符)
                //.generateNonExecutableJson()
                //禁止转义html标签
                //.disableHtmlEscaping()
                //格式化输出
                .setPrettyPrinting()
                //与@Expose配合使用
                .excludeFieldsWithoutExposeAnnotation()
                .create();
        String str = gson.toJson(expose);
        System.out.println(str);
        return str;
    }

由于注解的作用,序列化是没有expose字段属性

在这里插入图片描述

json日期格式的处理:

private static void datafomate(){
        GsonBuilder builder = new GsonBuilder();
        builder.setDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        Gson gson = builder.create();
    }

判断json中是否有属性:

private static void haselement(){
        String json1 = "{\"id\":\"1\",\"name\":\"Json技术\"}";
        String propertyName = "name";
        boolean isContains = false ;
        JsonParser jsonParser = new JsonParser();
        JsonElement element = jsonParser.parse(json1);
        JsonObject jsonObj = element.getAsJsonObject();
        isContains = jsonObj.has(propertyName);
    }

判断字符串是否是json对象:

private static boolean jsonflag() {
		boolean jsonFlag;
		User user = new User(1,"全球",21);
        try{
            String str = new Gson().toJson(user);
            JsonParser jsonParser = new JsonParser();
            JsonElement element = jsonParser.parse(str);
            JsonObject jsonObj = element.getAsJsonObject();
            jsonFlag = true;
        }catch (Exception e){
            jsonFlag = false;
        }
        return jsonFlag;
    }

增加json中的属性:

private static void add(){
        String json1 = "{\"id\":\"1\",\"name\":\"Json技术\"}";
        String propertyName = "desc";
        Object propertyValue = "json各种技术的调研";
        JsonParser jsonParser = new JsonParser();
        JsonElement element = jsonParser.parse(json1);
        JsonObject jsonObj = element.getAsJsonObject();
        jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));
        json1 = jsonObj.toString();
        System.out.println(json1);
    }

修改json中的属性:

private static void update(){
        String json1 = "{\"id\":\"1\",\"name\":\"Json技术\"}";
        String propertyName = "name";
        Object propertyValue = "json各种技术的调研";
        JsonParser jsonParser = new JsonParser();
        JsonElement element = jsonParser.parse(json1);
        JsonObject jsonObj = element.getAsJsonObject();
        jsonObj.remove(propertyName);
        jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));
        json1 = jsonObj.toString();
        System.out.println(json1);
    }
处理嵌套json格式的数据。。。 public static void main(String[] args) { // 官方API http://www.json.org/java/ /* 购物车中信息 goods_cart={cart_1325036696007:{goods_id:"100015",goods_name:"澳大利亚进口绵羊",goods_imgsrc:"http://192.168.1.180:7001//gwadmin/uploadimg/spxc/2011/12/9/100016_00948703_68.jpg",specs:"b555bfj05d7dcg307h91323398584156",specsstr:"颜色:黑色 尺寸:L",price:4765,stock:15,count:6},cart_1325036702105:{goods_id:"100015",goods_name:"澳大利亚进口绵羊",goods_imgsrc:"http://192.168.1.180:7001//gwadmin/uploadimg/spxc/2011/12/9/100016_00948703_68.jpg",specs:"787a9f5he93chcifh951323398314484",specsstr:"颜色:黑色 尺寸:XL",price:4700.15,stock:12,count:1},cart_1325136643984:{goods_id:"100015",goods_name:"澳大利亚进口绵羊",goods_imgsrc:"http://192.168.1.180:7001//gwadmin/uploadimg/spxc/2011/12/9/100015_00399656_68.jpg",specs:"8466347bi6eia43hd6j1323398639859",specsstr:"颜色:灰色 尺寸:XL",price:4600,stock:3,count:1}}; * **/ try{ String s0 = "{cart_1325036696007:{goods_id:"100015",goods_name:"澳大利亚进口绵羊",goods_imgsrc:"http://192.168.1.180:7001//gwadmin/uploadimg/spxc/2011/12/9/100016_00948703_68.jpg",specs:"b555bfj05d7dcg307h91323398584156",specsstr:"颜色:黑色 尺寸:L",price:4765,stock:15,count:6},cart_1325036702105:{goods_id:"100015",goods_name:"澳大利亚进口绵羊",goods_imgsrc:"http://192.168.1.180:7001//gwadmin/uploadimg/spxc/2011/12/9/100016_00948703_68.jpg",specs:"787a9f5he93chcifh951323398314484",specsstr:"颜色:黑色 尺寸:XL",price:4700.15,stock:12,count:1},cart_1325136643984:{goods_id:"100015",goods_name:"澳大利亚进口绵羊",goods_imgsrc:"http://192.168.1.180:7001//gwadmin/uploadimg/spxc/2011/12/9/100015_00399656_68.jpg",specs:"8466347bi6eia43hd6j1323398639859",specsstr:"颜色:灰色 尺寸:XL",price:4600,stock:3,count:1}};"; String s= java.net.URLDecoder.decode(s0, "utf-8"); System.out.println(s); JSONObject o = new JSONObject(s); System.out.println(o.get("cart_1325036696007")); //根据属性,获取值 System.out.println(o.toString()); //得到字符串 System.out.println(o.names().get(2)); //获取对象中第三组属性名 System.out.println(o.names().length()); //获取对象中属性个数 //System.out.println(o.names().getJSONArray(1)); //获取对象中属性个数 //names(jsonObjectName) 私有方法 获取该对象的所有属性名,返回成JSONArray。 //JSONObject.getNames(jsonObjectName) 静态方法 获取对象的所有属性名,返回成数组。 System.out.println(JSONObject.getNames(o.getJSONObject("cart_1325036696007"))[1]); System.out.println(o.getJSONObject("cart_1325036696007").names().get(1)); System.out.println(o.length()); //共有几组对象 System.out.println(o.has("cart_1325036696007")); //有无该该值 /* 遍历json中的每一组元素*/ String name = null; JSONObject t_o = null; for(int i=0; i<o.length(); i++){ name = JSONObject.getNames(o)[i]; System.out.println("商品项ID:"+name); t_o = o.getJSONObject(name); for(int j=0; j< t_o.length(); j++){ name = JSONObject.getNames(t_o)[j]; System.out.print(name+":"+t_o.get(name)+" "); } System.out.println(); } }catch(Exception e){ e.printStackTrace(); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值