GSON-使用指南(一)

JSON 是一种文本形式的数据交换格式,它比XML更轻量、比二进制容易阅读和编写,调式也更加方便.其重要性不言而喻.解析和生成的方式很多,Java中最常用的类库有:JSON-Java、Gson、Jackson、FastJson等,本次介绍的是Gson.

GSON-基本类型的转换

import com.google.gson.Gson;

/**
 * @author ASUS 2020/8/10 22:19
 */
public class GsonTest {
    public static void jblx(){
        Gson gson = new Gson();
        int i = gson.fromJson("100", int.class);//100
        System.out.println(i);
        double d = gson.fromJson("99.99", double.class);//99.99
        System.out.println(d);
        boolean b = gson.fromJson("true", boolean.class);//true
        System.out.println(b);
        String str = gson.fromJson("String", String.class);//String
        System.out.println(str);
        double d2 = gson.fromJson("\"99.99\"", double.class);//99.99
        System.out.println(d2);
    }
    public static void main(String[] args) {
//        jblx();//基本数据类型的转换

        //====toJson()会转换成一个json字符串,而不是普通字符串
//        Gson gson = new Gson();
//        String jsonNumber = gson.toJson(100);       // "100"
//        String jsonBoolean = gson.toJson(false);    // "false"
//        String jsonString = gson.toJson("String"); //"String"
//        System.out.println(jsonNumber);
//        System.out.println(jsonBoolean);
//        System.out.println("String".equals("String"));
//        System.out.println(jsonString.equals("String"));

    }
}

GSON解析可能出现的问题-泛型擦除(只剩原始类型)

public class GsonTTest {
    public static void main(String[] args) {
        Gson gson = new Gson();
        String jsonArray = "[\"Android\",\"Java\",\"PHP\"]";//json数组
        String[] strings = gson.fromJson(jsonArray, String[].class);//直接用List<String>.class?List<User>.class?它们的原始类型都是List.class(泛型擦除)
        List<String> stringList = gson.fromJson(jsonArray, new TypeToken<List<String>>(){}.getType());//避免泛型擦除问题
    }
}

Gson-TypeToken提供对泛型的支持(解决泛型擦除)

  • @SerializedName:当我们的json字符串中的属性和pojo对象的属性无法对应时,无法完成解析转换,可以使用这个注解.另外,需要定义多个映射规则方案时,可以使用alternate属性指定多个匹配项(满足任意一个即可).
  • 通过泛型减少重复代码的编写
import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;

/**
 * @author ASUS
 * @date 2020/8/10 22:35
 * @service []
 * @description 功能描述 POJO类的生成与解析
  * @param
 **/
public class User {
    public String name;
    public int age;
//    @SerializedName("email_address")
    @SerializedName(value = "emailAddress",alternate = {"email","email_address"})
    public String emailAddress;

    public User() {
    }

    public User(String emailAddress) {
        this.emailAddress = emailAddress;
    }

    public User(String name, int age) {
        this.name=name;
        this.age=age;
    }

    public static void main(String[] args) {
        //生成json <==== T
//        Gson gson = new Gson();
//        User user = new User("loser",22);
//        String jsonObject = gson.toJson(user); // {"name":"怪盗kidou","age":24}
//        System.out.println("[生成json]====>>>>>>>>>>>>>>>>"+jsonObject);

        //解析json ===> T
//        Gson gson = new Gson();
//        String jsonString = "{\"name\":\"loser-kgc\",\"age\":22}";
//        User user = gson.fromJson(jsonString, User.class);
//        System.out.println("[解析json字符串为T]====>>>>>>>>"+user);
//        System.out.println("[解析json字符串为T]====>>>>>>>>"+user.name+","+user.age);

        Gson gson = new Gson();
        String jsonString = "{\"email_address\":\"123@qq.com\"}";
        User user = gson.fromJson(jsonString, User.class);
        System.out.println(user.emailAddress);//需开启注解
        String jsonString2 = "{\"email\":\"123@qq.com\"}";
        User user2 = gson.fromJson(jsonString2, User.class);
        System.out.println(user2.emailAddress);//需开启注解
    }
}
/**
 * @author ASUS 2020/8/10 23:21
 */
public class UserResult {
    public int code;
    public String message;
    public User data;
}

定义泛型类

/**
 * @author ASUS 2020/8/10 23:39
 */
public class Result<T> {
    public int code;
    public String message;
    public T data;
}

案例

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.List;

/**
 * @author ASUS 2020/8/10 23:21
 */
public class UserListResult {
    public int code;
    public String message;
    public List<User> data;

    public static void main(String[] args) {
        String json = "{\"code\":123,\"message\":\"hahaha\",\"data\":{\"name\":\"loser-kgc\",\"age\":22}}";
        Gson gson = new Gson();
//        UserResult userResult = gson.fromJson(json,UserResult.class);
//        User user = userResult.data;
        System.out.println(user.emailAddress+","+user.name+","+user.age);
//        System.out.println("=====================2=============================");
//        json = "{\"code\":123,\"message\":\"hahaha\",\"data\":[{\"name\":\"loser-kgc\",\"age\":22},{\"name\":\"loser2-kgc2\",\"age\":11}]}";
//        UserListResult userListResult = gson.fromJson(json,UserListResult.class);
//        List<User> users = userListResult.data;
//        for (User item:users) {
//            System.out.println(item.emailAddress+","+item.name+","+item.age);
//        }
//        System.out.println("=====================3=============================");
//        Type userType = new TypeToken<Result<User>>(){}.getType();//new TypeToken(Object<T>)
//        Result<User> userResult = gson.fromJson(json,userType);//对象属性
//        User user = userResult.data;
//        System.out.println(user.emailAddress+","+user.name+","+user.age);

        json = "{\"code\":123,\"message\":\"hahaha\",\"data\":[{\"name\":\"loser-kgc\",\"age\":22},{\"name\":\"loser2-kgc2\",\"age\":11}]}";
        Type userListType = new TypeToken<Result<List<User>>>(){}.getType();//new TypeToken(Object<List<T>>)
        Result<List<User>> userListResult = gson.fromJson(json,userListType);//列表属性
        List<User> users = userListResult.data;
        for (User item:users){
            System.out.println(item.emailAddress+","+item.name+","+item.age);
        }
    }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值