通透Gson@Expose注解、@SerializedName、解析json数据

在讲如何解析数据之前,先描述一下gson中的两个注解@Expose和@SerializedName。

@Expose注解的作用:区分实体中不想被序列化的属性,其自身包含两个属性deserialize(反序列化)和serialize(序列化),默认都为true。

使用 new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();创建Gson对象,没有@Expose注释的属性将不会被序列化.。

private class User{
      private int id;
      @Expose
      private String name;
      .......

}
这样create() gson对象序列化user,只会有name这一个属性

@SerializedName注解的作用:定义属性序列化后的名称

public class User{
     private int id;
     @Expose
     @SerializedName("username")
     private String name;
     .......

}

另外想要不序列化某个属性,也可以使用transient。

private class User{
      private int id;
      private transient String name;
      .......

}

下面列举一下gson如何解析json数据的

//转换器
GsonBuilder builder = new GsonBuilder();
<span style="color:#ff0000;">// 不转换没有 @Expose 注解的字段</span>
builder.excludeFieldsWithoutExposeAnnotation();
Gson gson = builder.create();
<span style="color:#ff0000;">//1、对象转string</span>
Student stu = new Student();
stu.setStudentId(333);
stu.setStudentName("qqq");
String stuStr = gson.toJson(stu);
System.out.println(stuStr); //{"studentName":"qqq","studentId":333}
<span style="color:#ff0000;">//2、string转对象</span>
Student user2 = gson.fromJson(stuStr, Student.class);
System.out.println(user2);
String stuTemp = "{\"studentName\":\"qqq2\",\"studentId\":3335}";
Student user4 = gson.fromJson(stuTemp, Student.class);
System.out.println(user4);
<span style="color:#ff0000;">//3、对象List转string</span>
List<Student> testBeanList = new ArrayList<Student>();
Student testBean = new Student();
testBean.setStudentId(555);
testBean.setStudentName("552");
testBeanList.add(testBean);
//Gson gsonList = new Gson();
Type type = new TypeToken<List<Student>>(){}.getType(); //指定集合对象属性
String beanListToJson = gson.toJson(testBeanList, type);
System.out.println(beanListToJson); //[{"studentName":"552","studentId":555}]
<span style="color:#ff0000;">//集合string转对象list</span>
List<Student> testBeanListFromJson = gson.fromJson(beanListToJson, type);
System.out.println(testBeanListFromJson); //[555:552]
<span style="color:#ff0000;">//4、集合如果不指定类型 默认为String</span>
List<String> testList = new ArrayList<String>();
testList.add("first");
testList.add("second");
String listToJson = gson.toJson(testList);
System.out.println(listToJson); //["first","second"]
<span style="color:#ff0000;">//5、集合字符串转回来需要指定类型</span>
List<String> testList2 = (List<String>) gson.fromJson(listToJson,new TypeToken<List<String>>() {}.getType());
System.out.println(testList2);
<span style="color:#ff0000;">//6、 将HashMap字符串转换为 JSON</span>
Map<String, String> testMap = new HashMap<String, String>();
testMap.put("id", "id.first");
testMap.put("name", "name.second");
String mapToJson = gson.toJson(testMap);
System.out.println(mapToJson); //{"id":"id.first","name":"name.second"}
<span style="color:#ff0000;">//7、stringMap转对象</span>
Map<String, String> userMap2 = (Map<String, String>) gson.fromJson(mapToJson,new TypeToken<Map<String, String>>() {}.getType());
System.out.println(userMap2); //{id=id.first, name=name.second}
<span style="color:#ff0000;">//8、对象含有普通对象、集合、map情况</span>
Student user1 = new Student();
user1.setStudentId(1001);
user1.setStudentName("张三");
Student user3 = new Student();
user3.setStudentId(1002);
user3.setStudentName("李四");
Map<String, Student> userMap = new HashMap<String, Student>();
userMap.put("user1", user1);
userMap.put("user3", user3);
List<Student> userList = new ArrayList<Student>();
userList.add(user1);
userList.add(user3);
Teacher groupBean = new Teacher();
groupBean.setStudent(user1);
groupBean.setStus(userList);
groupBean.setMap((HashMap)userMap);
//groupBean.setUserList(userList);
Gson gsonGroup = new Gson();
String sGroupBean = gsonGroup.toJson(groupBean, new TypeToken<Teacher>() {}.getType());
System.out.println(sGroupBean);
/*{"stus":[{"studentName":"张三","studentId":1001},{"studentName":"李四","studentId":1002}],"student":{"studentName":"张三","studentId":1001},"map":{"user3":{"studentName":"李四","studentId":1002},"user1":{"studentName":"张三","studentId":1001}},"id":0,"age":0}*/
<span style="color:#ff0000;">//9、复杂对象string转对象</span>
Teacher groupBean2 = (Teacher) gson.fromJson(sGroupBean,new TypeToken<Teacher>() {}.getType());
System.out.println(groupBean2);
 

package com.andtools;
import com.google.gson.annotations.Expose;
public class Student {
  @Expose
  private String studentName;
  @Expose
  private int studentId;
  public Student(){}
  public Student(int studentId,String studentName){
    this.setStudentId(studentId);
    this.setStudentName(studentName);
  }
  public String toString(){
    return this.getStudentId() + ":" + this.getStudentName();
  }
  public String getStudentName() {
    return studentName;
  }
  public void setStudentName(String studentName) {
   this.studentName = studentName;
  }
  public int getStudentId() {
   return studentId;
  }
  public void setStudentId(int studentId) {
   this.studentId = studentId;
  }
}
 

package com.andtools;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.annotations.Expose;
public class Teacher {
  @Expose
  private int id;
  @Expose
  private String name;
  @Expose
  private int age;
  @Expose
  private Student student;
  @Expose
  private List stus;
  @Expose
  private HashMap map;
  public String toString(){
    return this.getId()+":"+this.getName()+":"+this.getAge() +":"+ this.getStudent().toString() + ":" + this.getStus() + ":" + this.getMap();
  }
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  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 Student getStudent() {
    return student;
  }
  public void setStudent(Student student) {
    this.student = student;
  }
  public List getStus() {
    return stus;
  }
  public void setStus(List stus) {
    this.stus = stus;
  }
  public HashMap getMap() {
    return map;
  }
  public void setMap(HashMap map) {
    this.map = map;
  }
}






郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。