GSON:谷歌的一款開源項目,主要用於解析json數據,有很多很友好的個性化設置
思想:把json字符串與java對象相關聯
序列化:把java對象轉換成json字符串
反序列化:把json字符串轉換成java對象
使用springMVC獲取web前端傳送過來的數據
Gson處理簡單數據(key對應的value是簡單的String類型/或者number)
Gson的使用前提:導入jar包 gson-2.2.4.jar
主要的方法:
Gson fromJson(String jsonStr,Type) //用於把json字符串轉換成type類型的java對象
String toJson(Object obj) //把obj對象變成json字符串
例如:
前端傳送如下json字符串:
{
"username":"kylin",
"password":"123456"
}
//那么controller中就可以有如下的操作(User類的內容就不導入)
@RequestMapping(value = "/LOGIN",method = RequestMethod.POST) public String LOGIN(@RequestBody String jsonStr){ //使用gson來獲取數據並且進行操作 Gson gson=new Gson(); //序列化 User user=gson.fromJson(jsonStr,User.class); String username=user.getUsername(); String password=user.getPassword(); System.out.println(username+" "+password); return "welcome"; }
Gson處理復雜數據(key對應的value可能是數組/對象)
處理方式:
如果是對象的話,那么對應的javabean類,需要設置一個公有的內部類對象,如果是數組的話,那么對應的javabean類中可以把對應的字段設置為list集合/set集合
例如:
前端傳送數據如下:
{ "name":"kylin", "age":20, "major":["English","Chinese","math"], "grade":{ "course":"computer", "score":"100", "level":"good" } }
對應的Student類:
Student.java
package com.kylin.JavaBean; import java.util.List; public class Student { private String name; //名字 private int age; //年紀 private List<String> major; //主修課程 private Grade grade; //某科目 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public List<String> getMajor() { return major; } public void setMajor(List<String> major) { this.major = major; } public Grade getGrade() { return grade; } public void setGrade(Grade grade) { this.grade = grade; } //注意:內部類應該被設置為public public class Grade { private String course; private String score; private String level; public String getCourse() { return course; } public void setCourse(String course) { this.course = course; } public String getScore() { return score; } public void setScore(String score) { this.score = score; } public String getLevel() { return level; } public void setLevel(String level) { this.level = level; } } }
Controller中請求處理方法:
@RequestMapping(value = "/Student",method = RequestMethod.POST) public String Student_Login(@RequestBody String jsonStr){ //jsonstr獲取數據 /* { "name":"kylin", "age":20, "major":["English","Chinese","math"], "grade":{ "course":"computer", "score":"100", "level":"good" } } * */ //因為本地已經有想匹配的javabean對象,所有直接當成簡單的數據獲取就 Gson gson=new Gson(); Student student=gson.fromJson(jsonStr,Student.class); //成功獲取數組里面的內容 List<String> major=student.getMajor(); for (String i:major){ System.out.println(i); } //接下來就是解析內部類中的內容 /* Outter outter = new Outter(); Outter.Inner inner = outter.new Inner(); //必須通過Outter對象來創建*/ //成功獲取grade對象 Student.Grade grade=student.new Grade(); grade=student.getGrade(); String gradeCourse=grade.getCourse(); String gradeLevel=grade.getLevel(); String gradeScore=grade.getScore(); System.out.println("內部的東西"+gradeScore+gradeCourse+gradeLevel); return "welcome"; //welcome是一個jsp文件,配置了視圖解析器的,不需要過多的糾結 }
以上是從web前端獲取json數據----簡單數據,復雜數據(含有數組/對象)的處理方式;下面將介紹如何從web后端傳送符合規范的json字符串給前端。
后端返回簡單數據給前端------過於簡單這里就不介紹了,主要介紹后端返回復雜json數據給前端的方法
后端返回復雜json字符串給前端
方式:使用javabean/使用map集合
使用javabean方式
@RequestMapping(value = "/DataBackByJavaBean",method = RequestMethod.POST)
@ResponseBody
public String DataBack(@RequestParam String id){
//本來是需要獲取前端傳過來的id,然后進行數據庫查詢 然后再返回結果 這里就隨便的進行一次獲取吧
System.out.println("前端傳過來的id:"+id);
//設置需要傳送的數據
Student student=new Student();
student.setName("kylin");
student.setAge(11);
List<String> major=new ArrayList<>();
major.add("Chinese");
major.add("Math");
student.setMajor(major);
Student.Grade grade=student.new Grade();
grade.setCourse("XXX");
grade.setScore("111");
grade.setLevel("good");
student.setGrade(grade);
//數據設置完畢 進行gson操作-----變成json字符串
//使用GsonBuilder創建的gson對象會更加的強大,可以有更多的個性化操作
GsonBuilder gsonBuilder=new GsonBuilder();
Gson gson=gsonBuilder.create();
String jsonStr=gson.toJson(student);
System.out.println(jsonStr);
return jsonStr;
}
使用map集合方式(優點:對於需要返回的數據可以任意設置,不用局限於只能使用javabean的屬性)
@RequestMapping(value = "/DataBackByMap",method = RequestMethod.POST) @ResponseBody public String DataBackByMap(@RequestParam String id){ System.out.println(id); //使用map方式來處理
Map<String,Object>params=new HashMap<>(); params.put("status","200"); params.put("name","kylin"); List<String> major=new LinkedList<>(); major.add("XXX"); major.add("YYY"); params.put("major",major); Student student=new Student(); Student.Grade grade=student.new Grade(); grade.setLevel("GOOD"); grade.setScore("1111"); grade.setCourse("xxxxxxssss"); params.put("grade",grade); //轉換成jsonStr字符串
GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() { @Override public String translateName(Field field) { if (field.getName().equals("name")){ return "NAME"; } return field.getName(); } }); Gson gson = gsonBuilder.create(); gson.toJson() String jsonStr=gson.toJson(params); System.out.println(params); return jsonStr; }
以上主要介紹了如何從web前端獲取json數據並且如何從web后端傳送數據給web前端(如果對@RequestBody和@ResponseBody不理解的朋友,可以自行百度)
下面主要擴展性的講解一下Gson的一些其他特性:
1.修改javaBean中的屬性在json轉換中的名字
有兩種方式,分別是:
1.@SerializedName 注解的使用(在定義javaBean類的時候,對屬性進行注解)
2.GsonBuilder的 setFieldNamingStrategy 方法 ,FieldNamingStrategy 自定義規則
比如需要的數據是:
{ "id":"123", "name":"kylin", "author":{ "id":"222", "name":"kkkk" } }
而實際類對應的數據是:
{ "id":"123", "name":"kylin", "user":{ "id":"222", "name":"kkkk" } }
方式一:
在對應的javaBean類中;在user屬性上添加注解@SerializedName
@SerializedName("author") private User user;
例如:
@SerializedName(value = "user_password", alternate = {"userName", "username"})//value是默認字段名稱、alternate是備選字段名稱 private String userPassword;
缺點:這種方式會使得以后所有涉及到該屬性的json在轉換的過程中,user都會變成author;而且其權限相對較大,會覆蓋其他的對該屬性的操作,比如我在另外一個地方使用方式2來
對屬性的名字進行修改,但最終還是會被其@SerializedName覆蓋
方式二:(推薦)
GsonBuilder的 setFieldNamingStrategy 方法 ,FieldNamingStrategy 自定義規則
GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.setFieldNamingStrategy(new FieldNamingStrategy() { @Override public String translateName(Field field) { if (field.getName().equals("name")){ //相當於遍歷一遍,如果找到名字為name的就把他變成NAME
return "NAME" } return field.getName(); } }); Gson gson = gsonBuilder.create();
FieldNamingStrategy中還有很多其他的規則,如果有興趣可以自己去了解一下~
下面貼一些GsonBuilder中比較常見的方法和注解
//序列化null serializeNulls() // 設置日期時間格式,另有2個重載方法 // 在序列化和反序化時均生效 setDateFormat("yyyy-MM-dd") // 禁此序列化內部類 disableInnerClassSerialization() //生成不可執行的Json(多了 )]}' 這4個字符) generateNonExecutableJson() //禁止轉義html標簽 disableHtmlEscaping() //格式化輸出 setPrettyPrinting() create()
@Expose(serialize=true,deserialize=false)
private String name;//序列化是忽略,反序列化時參與。