文章目录
一、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()
扫描二维码关注公众号,回复:
10783927 查看本文章
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解析交互详解