Java (十三)Java web:GSON的学习


一、json是什么

json有2种类型:

  • 对象object,{key:value , key:value,...}:里面是键值对,用{}
  • 数组array,[value , value,...]:里面是值,用[]

对象和数组之间可以互相嵌套。

PS:如何加入包:Java(十三)Java web:Eclipse创建maven web项目

二、生成json字符串:toJson()

public String toJson(Objcet obj)

1.两种gson对象的创建

  • new Gson()
Gson gson = new Gson();
String gsonStr = gson.toJson();
  • new GsonBuilder().create()
Gson gson = new GsonBuilder().create();
String gsonStr = gson.toJson();

2.toJson()

直接把要转化的对象传入,自动判断类型转化

  • 基本类型
Gson gson = new Gson();
System.out.println(gson.toJson(true));		// true
System.out.println(gson.toJson(123));		// 123
System.out.println(gson.toJson(3.14));		// 3.14
System.out.println(gson.toJson("Hello"));	// "Hello"
  • 对象
public class Person {

	private String name;
	private int age;

	public Person() {
	};

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
}
Gson gson = new Gson();
Person p = new Person("Victor", 18);
System.out.println(gson.toJson(p));		// {"name":"Victor","age":18}
  • List:json数组形式
List<String> list =new ArrayList<>();
list.add("Hello");
list.add("World");
Gson gson = new Gson();
System.out.println(gson.toJson(list));	// ["Hello","World"]
  • Map:json对象形式
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
Gson gson = new Gson();
System.out.println(gson.toJson(map));	// {"A":1,"B":2}

3.任意

  • JsonObject
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("name","Victor");
jsonObject.addProperty("age",18);
// 只要转化成String就行
Gson gson = new Gson();
Person p = new Person("Victor", 18);
jsonObject.addProperty("Person", gson.toJson(p));
  • JsonArray
JsonArray jsonArray = new JsonArray();
jsonArray.add("1");
jsonArray.add("2");
// 只要转化成String就行
Gson gson = new Gson();
Person p = new Person("Victor", 18);
jsonArray.add(gson.toJson(p))

三、从json转化:fromJson()

public T fromJson(String jsonStr, T.class)

1.直接写T的类型

(1)严格类型

  • 基本类型
Gson gson = new Gson();
String jsonStrBoolean = "true";
String jsonStrInteger = "123";
String jsonStrDouble = "3.14";
String jsonStrString = "\"Hello\"";		// json结果中的字符串类型是有引号的,所以要加转义字符
System.out.println(gson.fromJson(jsonStrBoolean, Boolean.class));	// true
System.out.println(gson.fromJson(jsonStrInteger, Integer.class));	// 123
System.out.println(gson.fromJson(jsonStrDouble, Double.class));		// 3.14
System.out.println(gson.fromJson(jsonStrString, String.class));		// Hello

System.out.println(gson.fromJson(jsonStrBoolean, Boolean.class).getClass());	// class java.lang.Boolean
System.out.println(gson.fromJson(jsonStrInteger, Integer.class).getClass());	// class java.lang.Integer
System.out.println(gson.fromJson(jsonStrDouble, Double.class).getClass());		// class java.lang.Double
System.out.println(gson.fromJson(jsonStrString, String.class).getClass());		// class java.lang.String
  • 对象
public class Person {

	private String name;
	private int age;

	public Person() {
	};

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

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "" + this.name + " " + this.age ;
	}
}
Gson gson = new Gson();
String jsonStrPerson = "{\"name\":\"Victor\",\"age\":18}";
Person p = gson.fromJson(jsonStrPerson, Person.class);
System.out.println(p);

(2)严格Json转String

有时你不知道前端传过来什么类型的时候,就可以转String.class

  • 基本类型
/* 严格Json转String */
Gson gson = new Gson();
String jsonStrBoolean = "true";
String jsonStrInteger = "123";
String jsonStrDouble = "3.14";
String jsonStrString = "\"Hello\"";		// json结果中的字符串类型是有引号的,所以要加转义字符

// Boolean不可以转Integer
// System.out.println(gson.fromJson(jsonStrBoolean, Integer.class).getClass());
System.out.println(gson.fromJson(jsonStrBoolean, String.class).getClass());		// class java.lang.String
System.out.println(gson.fromJson(jsonStrInteger, String.class).getClass());		// class java.lang.String
System.out.println(gson.fromJson(jsonStrDouble, String.class).getClass());		// class java.lang.String
System.out.println(gson.fromJson(jsonStrString, String.class).getClass());		// class java.lang.String
  • 对象当然也可以,里面全是String类型的成员变量

(3)非严格转严格类型

只要前台Json都传过来String类型的,是有自动匹配的,后台不用担心,随便转换成自己的类型。

  • 基本类型
/* 非严格Json都传过来String类型的 */
Gson gson = new Gson();
String jsonStrBoolean = "\"true\"";
String jsonStrInteger = "\"123\"";
String jsonStrDouble = "\"3.14\"";
// 只有这种,没有再加一对引号的,String jsonStrString = "\"Hello\"";

System.out.println(gson.fromJson(jsonStrBoolean, Boolean.class).getClass());	// class java.lang.Boolean
System.out.println(gson.fromJson(jsonStrInteger, Integer.class).getClass());	// class java.lang.Integer
System.out.println(gson.fromJson(jsonStrDouble, Double.class).getClass());		// class java.lang.Double
System.out.println(gson.fromJson(jsonStrString, String.class).getClass());		// class java.lang.String
  • 对象
/* 非严格Json都传过来String类型的 */
Gson gson = new Gson();
String jsonStrPersonStrict = "{\"name\":\"Victor\",\"age\":18}";
Person p2 = gson.fromJson(jsonStrPersonNotStrict, Person.class);
System.out.println(p2);		// Victor 18

2.需要类型转化的(不管你传啥都可以解析,然后自己再转)

new TypeToken<XXX>(){}.getType()

  • Map:json对象形式
    就传int型的数字需要注意一下,(int)Double.parseDouble(map.get("A").toString()),先转字符串,再转double,再转int。
    因为Object自动扩展为double,字符串解析出来是"1.0"而不是"1",直接转int会出错。
Gson gson = new Gson();
// 不管你传啥都可以解析为String,然后自己再转。
String jsonStrMap = "{"
+ "\"A\":1,\"B\":\"1\","
+ "\"C\":true,\"D\":\"true\","
+ "\"E\":\"hello\","
+ "\"F\":[1,true,\"3\"],"
+ "\"G\":{\"p\":1,\"q\":\"1\"}"
+ "}";
Map<Object,Object> map = gson.fromJson(jsonStrMap, new TypeToken<HashMap<Object,Object>>(){}.getType());

/* 传严格的1值是解析出1.0 */
// System.out.println(map.get("A").toString());
// 1.0
int A = (int)Double.parseDouble(map.get("A").toString());
System.out.println(A);

/* 传非严格的1你也这么解析,就不用特意写了 */
// int B = Integer.parseInteger(map.get("A").toString());
int B = (int)Double.parseDouble(map.get("A").toString());
System.out.println(B);

// Boolean
Boolean C = Boolean.parseBoolean(map.get("C").toString());
System.out.println(C);

Boolean D = Boolean.parseBoolean(map.get("D").toString());
System.out.println(D);

// String
String E = map.get("E").toString();
System.out.println(E);

// JsonArray
List<Object> F = (List<Object>) map.get("F");
int a = (int)Double.parseDouble(F.get(0).toString());
System.out.println(a);
Boolean b = Boolean.parseBoolean(F.get(1).toString());
System.out.println(b);
String c = F.get(2).toString();
System.out.println(c);

// JsonObject
Map<Object,Object> G = gson.fromJson(jsonStrMap, new TypeToken<HashMap<Object,Object>>(){}.getType());
int p = (int)Double.parseDouble(map.get("A").toString());
System.out.println(p);
int q = (int)Double.parseDouble(map.get("A").toString());
System.out.println(q);
  • List:json数组形式
Gson gson = new Gson();
// 不管你传啥都可以解析为String,然后自己再转。
String jsonStrList = "[\"Hello\",\"World\"]";
List<Object> list = gson.fromJson(jsonStrList, new TypeToken<ArrayList<Object>>(){}.getType());

四、在servlet中使用json

1.接受

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	/* 解决乱码 */
	request.setCharacterEncoding("utf-8");
	
	// 获取jsonStr
	StringBuffer jsonStr = new StringBuffer();
    String line = null;
    try {
        BufferedReader reader = request.getReader();
        while ((line = reader.readLine()) != null) {
            jsonStr.append(line);
        }
    } catch (Exception e) {
        System.out.println(e);
    }
}

2.响应

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	// 设置json格式
	response.setContentType("application/json;charset=utf-8");
	// setContentType与setCharacterEncoding的顺序不能调换,否则还是无法解决中文乱码的问题
	response.setCharacterEncoding("utf-8");
	
	// 编码的设置需要在获取输出对象之前,否则无法生效
	PrintWriter out = response.getWriter();
	Gson gson = new Gson();
	String jsonStr = gson.toJson("Hello");
	out.print(jsonStr);
}

五、响应码类

  • ResultList
import java.util.List;

public class ResultList<T> {
    // 0:查询失败;200:查询成功
    private String status;

    // 查询失败错误信息
    private String errorMessage;

    private List<T> list;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getErrorMessage() {
        return errorMessage;
    }

    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }

    public List<T> getList() {
        return list;
    }

    public void setList(List<T> list) {
        this.list = list;
    }
}
  • ResultObject
public class ResultObject<T> {
    // 0:查询失败;200:查询成功
    private String status;

    // 查询失败错误信息
    private String errorMessage;

    private T object;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getErrorMessage() {
        return errorMessage;
    }

    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }

    public T getObject() {
        return object;
    }

    public void setObject(T object) {
        this.object = object;
    }
}

Reference

Gson介绍-苏白2016
【JavaWeb】Gson简要使用笔记
GSON
Java 中 Gson的使用
java web 简单 json 交互
Java web json解析交互详解

发布了486 篇原创文章 · 获赞 204 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/sandalphon4869/article/details/105316503
今日推荐