GSON 라이브러리를 사용하여 Java 객체를 JSON 객체로 변환하는 단계 인스턴스 상세 정보

12094 단어 GSON
List와map 등 구조에 대한 상용 변환 작업은 기본적으로 우리가 처리하는 절대 다수의 수요를 만족시킬 수 있지만, 때로는 프로젝트에서 json에 대해 특수한 형식 규정이 있다.예를 들어 아래의 json 직렬 해석:[{"tableName":"students","tableData":[{"id":1,"name":" ","birthDay":"Jun 22, 2012 9:54:49 PM"},{"id":2,"name":" ","birthDay":"Jun 22, 2012 9:54:49 PM"},{"id":3,"name":" ","birthDay":"Jun 22, 2012 9:54:49 PM"}]},{"tableName":"teachers","tableData":[{"id":1,"name":" ","title":" "},{"id":2,"name":" ","title":" "}]}]분석한 후에 우리는 일반적인 방식이 위의 json열을 처리하기 어렵다는 것을 발견했다.본문이 어떻게 처리되었는지 보십시오.
엔티티 클래스:

import java.util.Date; 
 
public class Student { 
  private int id; 
  private String name; 
  private Date birthDay; 
 
  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 Date getBirthDay() { 
    return birthDay; 
  } 
 
  public void setBirthDay(Date birthDay) { 
    this.birthDay = birthDay; 
  } 
 
  @Override 
  public String toString() { 
    return "Student [birthDay=" + birthDay + ", id=" + id + ", name=" 
        + name + "]"; 
  } 
 
} 

public class Teacher { 
  private int id; 
 
  private String name; 
 
  private String title; 
 
  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 String getTitle() { 
    return title; 
  } 
 
  public void setTitle(String title) { 
    this.title = title; 
  } 
 
  @Override 
  public String toString() { 
    return "Teacher [id=" + id + ", name=" + name + ", title=" + title 
        + "]"; 
  } 
 
} 

여기서 TableData 엔티티 클래스를 정의합니다.

import java.util.List; 
 
public class TableData { 
 
  private String tableName; 
 
  private List tableData; 
 
  public String getTableName() { 
    return tableName; 
  } 
 
  public void setTableName(String tableName) { 
    this.tableName = tableName; 
  } 
 
  public List getTableData() { 
    return tableData; 
  } 
 
  public void setTableData(List tableData) { 
    this.tableData = tableData; 
  } 
} 

테스트 클래스:
(자세히 보면 json을 대상으로 전환하는 실현을 보면 여기서 두 번의 전환을 거쳐 첫 번째 전환의 결과는 맵이 우리가 기대하는 대상이 아니라는 것이다. 맵에 대해 다시 json으로 전환한 후에 대상으로 전환한다. 내가 인용한 것은 Gson2.1의jar 처리가 정상적이다. 마치 Gson1.6의jar를 사용하면 오류를 보고할 수 있기 때문에 최신 버전을 사용하는 것을 권장한다.)

import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 
 
import com.google.gson.Gson; 
import com.google.gson.reflect.TypeToken; 
 
public class GsonTest5 { 
 
  /** 
   * @param args 
   */ 
  public static void main(String[] args) { 
    //  Json-->start 
    Student student1 = new Student(); 
    student1.setId(1); 
    student1.setName(" "); 
    student1.setBirthDay(new Date()); 
 
    Student student2 = new Student(); 
    student2.setId(2); 
    student2.setName(" "); 
    student2.setBirthDay(new Date()); 
 
    Student student3 = new Student(); 
    student3.setId(3); 
    student3.setName(" "); 
    student3.setBirthDay(new Date()); 
 
    List<Student> stulist = new ArrayList<Student>(); 
    stulist.add(student1); 
    stulist.add(student2); 
    stulist.add(student3); 
 
    Teacher teacher1 = new Teacher(); 
    teacher1.setId(1); 
    teacher1.setName(" "); 
    teacher1.setTitle(" "); 
 
    Teacher teacher2 = new Teacher(); 
    teacher2.setId(2); 
    teacher2.setName(" "); 
    teacher2.setTitle(" "); 
    List<Teacher> teacherList = new ArrayList<Teacher>(); 
    teacherList.add(teacher1); 
    teacherList.add(teacher2); 
 
    TableData td1 = new TableData(); 
    td1.setTableName("students"); 
    td1.setTableData(stulist); 
 
    TableData td2 = new TableData(); 
    td2.setTableName("teachers"); 
    td2.setTableData(teacherList); 
 
    List<TableData> tdList = new ArrayList<TableData>(); 
    tdList.add(td1); 
    tdList.add(td2); 
    Gson gson = new Gson(); 
    String s = gson.toJson(tdList); 
 
    System.out.println(s); 
    //  :[{"tableName":"students","tableData":[{"id":1,"name":" ","birthDay":"Jun 22, 2012 10:44:16 AM"},{"id":2,"name":" ","birthDay":"Jun 22, 2012 10:44:16 AM"},{"id":3,"name":" ","birthDay":"Jun 22, 2012 10:44:16 AM"}]},{"tableName":"teachers","tableData":[{"id":1,"name":" ","title":" "},{"id":2,"name":" ","title":" "}]}] 
    //  Json-->end 
 
    // ///////////////////////////////////////////////////////////////////// 
 
    //  json -->start 
    List<TableData> tableDatas2 = gson.fromJson(s, 
        new TypeToken<List<TableData>>() { 
        }.getType()); 
    for (int i = 0; i < tableDatas2.size(); i++) { 
      TableData entityData = tableDatas2.get(i); 
      String tableName = entityData.getTableName(); 
      List tableData = entityData.getTableData(); 
      String s2 = gson.toJson(tableData); 
      // System.out.println(s2); 
      // System.out.println(entityData.getData()); 
      if (tableName.equals("students")) { 
        System.out.println("students"); 
        List<Student> retStuList = gson.fromJson(s2, 
            new TypeToken<List<Student>>() { 
            }.getType()); 
        for (int j = 0; j < retStuList.size(); j++) { 
          System.out.println(retStuList.get(j)); 
        } 
 
      } else if (tableName.equals("teachers")) { 
        System.out.println("teachers"); 
        List<Teacher> retTchrList = gson.fromJson(s2, 
            new TypeToken<List<Teacher>>() { 
            }.getType()); 
        for (int j = 0; j < retTchrList.size(); j++) { 
          System.out.println(retTchrList.get(j)); 
        } 
      } 
    } 
 
    // Json -->end 
  } 
} 

출력 결과:

[{"tableName":"students","tableData":[{"id":1,"name":" ","birthDay":"Jun 22, 2012 10:04:12 PM"},{"id":2,"name":" ","birthDay":"Jun 22, 2012 10:04:12 PM"},{"id":3,"name":" ","birthDay":"Jun 22, 2012 10:04:12 PM"}]},{"tableName":"teachers","tableData":[{"id":1,"name":" ","title":" "},{"id":2,"name":" ","title":" "}]}] 
students 
Student [birthDay=Fri Jun 22 22:04:12 CST 2012, id=1, name= ] 
Student [birthDay=Fri Jun 22 22:04:12 CST 2012, id=2, name= ] 
Student [birthDay=Fri Jun 22 22:04:12 CST 2012, id=3, name= ] 
teachers 
Teacher [id=1, name= , title= ] 
Teacher [id=2, name= , title= ] 

TypeAdapter 등록 및 Enum 유형 처리
매거 유형은 우리 프로그램에 좋은 점을 가져다 주었는데, 어떻게 Gson으로 Json과의 상호작용을 실현합니까?본문을 보십시오.
본고는 TypeAdapter를 직접 작성하고 TypeAdapter를 등록하고 Enum 유형을 처리하는 방법을 중점적으로 파악합니다.
엔티티 클래스:

public enum PackageState { 
  PLAY, UPDATE, UPDATING, DOWNLOAD, DOWNLOADING, 
} 

public class PackageItem { 
  private String name; 
  private PackageState state; 
  private String size; 
 
  public String getName() { 
    return name; 
  } 
 
  public void setName(String name) { 
    this.name = name; 
  } 
 
  public PackageState getState() { 
    return state; 
  } 
 
  public void setState(PackageState state) { 
    this.state = state; 
  } 
 
  public String getSize() { 
    return size; 
  } 
 
  public void setSize(String size) { 
    this.size = size; 
  } 
 
  @Override 
  public String toString() { 
    return "PackageItem [name=" + name + ", size=" + size + ", state=" 
        + state + "]"; 
  } 
} 

직접 변환기를 써서 Json Serializer 인터페이스와 json Deserializer 인터페이스를 실현합니다.

import java.lang.reflect.Type; 
 
import com.google.gson.JsonDeserializationContext; 
import com.google.gson.JsonDeserializer; 
import com.google.gson.JsonElement; 
import com.google.gson.JsonParseException; 
import com.google.gson.JsonPrimitive; 
import com.google.gson.JsonSerializationContext; 
import com.google.gson.JsonSerializer; 
 
public class EnumSerializer implements JsonSerializer<PackageState>, 
    JsonDeserializer<PackageState> { 
 
  //  Json , JsonSerializer<PackageState>  
  @Override 
  public JsonElement serialize(PackageState state, Type arg1, 
      JsonSerializationContext arg2) { 
    return new JsonPrimitive(state.ordinal()); 
  } 
 
  // json , JsonDeserializer<PackageState>  
  @Override 
  public PackageState deserialize(JsonElement json, Type typeOfT, 
      JsonDeserializationContext context) throws JsonParseException { 
    if (json.getAsInt() < PackageState.values().length) 
      return PackageState.values()[json.getAsInt()]; 
    return null; 
  } 
 
} 
테스트 클래스:

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
 
public class GsonTest6 { 
 
  public static void main(String[] args) { 
    GsonBuilder gsonBuilder = new GsonBuilder(); 
    gsonBuilder.registerTypeAdapter(PackageState.class, 
        new EnumSerializer()); 
    Gson gson = gsonBuilder.create(); 
    PackageItem item = new PackageItem(); 
    item.setName("item_name"); 
    item.setSize("500M"); 
    item.setState(PackageState.UPDATING);//   state  
 
    String s = gson.toJson(item); 
    System.out.println(s); 
 
    System.out.println("--------------------------------"); 
 
    PackageItem retItem = gson.fromJson(s, PackageItem.class); 
    System.out.println(retItem); 
  } 
} 

결과 출력 (결과에서 state의 매개 형식을 int 형식으로 바꿨습니다):

{"name":"item_name","state":2,"size":"500M"} 
-------------------------------- 
PackageItem [name=item_name, size=500M, state=UPDATING] 

좋은 웹페이지 즐겨찾기