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);
}
}
}