Java의 JSON 변환 라이브러리 GSON의 기본 사용 강좌

6573 단어 JavaGSON
Gson (GitHub:https://github.com/google/gson)는 Google에서 제공하는 Java 객체와 JSON 데이터 사이를 매핑하는 Java 라이브러리입니다.JSON 문자열을 Java 객체로 변환하거나 반대로 변환할 수 있습니다.
Gson에서 가장 중요한 대상은 Gson과 GsonBuilder 두 개입니다.
Gson은 기본적인 2가지가 있어요.
(1) toJson() C 자바 객체를 JSON으로 변환
(2) fromJson() C JSON을 자바 객체로 변환
엔티티 클래스 작성:

public class People {
  String name;
  int age;
  boolean setName;
  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 boolean getSetName() {
    return setName;
  }
  public void setSetName(boolean setName) {
    this.setName = setName;
  }
  @Override
  public String toString() {
    return "name=" + name + " age=" + age + " setName=" +setName;
  }
}
테스트 클래스 작성 GsonTest

import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
/**
 * Convert java object to json.
 */
public class GsonTest {
  public static void main(String[] args) {
    People p = new People();
    p.setAge(20);
    p.setName("People");
    p.setSetName(true);
    Gson gson = new Gson();
    System.out.println(gson.toJson(p));
  }
}

출력 결과:

{"name":"People","age":20,"setName":true}
이것은 단지 가장 간단한 Gson의 사용일 뿐이다.만약 우리가 bool 형식의 속성 setName을 json으로 변환할 때 변환하지 않으면 어떻게 실현합니까?
Gson의 가방을 한참 동안 찾았는데 com을 발견했다.google.gson 패키지 아래에는 다음과 같은 인터페이스가 있습니다. Exclusion Strategy, 무엇을 하는지 알 수 없지만 이름에 따라 이 인터페이스는 Gson 변환 배제 정책을 설정하는 데 사용된 것으로 추정됩니다. 그래서 홈페이지에http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html이 인터페이스를 찾아보니 이 인터페이스를 실현하고 클래스의 대상을 Gson에 끼워 넣으면 json으로 변환할 때 Gson은 지정한 클래스나 속성을 필터합니다.그래서 다음 코드가 생겼습니다.

import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
/**
 * Convert java object to json, skip specific fileds.
 */
public class GsonTest {
  public static void main(String[] args) {
    People p = new People();
    p.setAge(20);
    p.setName("People");
    p.setSetName(true);
    ExclusionStrategy excludeStrategy = new SetterExclusionStrategy();
    Gson gson1 = new GsonBuilder()
      .setExclusionStrategies(excludeStrategy)
      .create();
    Gson gson2 = new Gson();
    String json1 = gson1.toJson(p);
    String json2 = gson2.toJson(p);
    System.out.println(json1);
    System.out.println(json2);

    People p1 = gson1.fromJson(json1, People.class);
    People p2 = gson2.fromJson(json2, People.class);
    System.out.println(p1);
    System.out.println(p2);
  }

  private static class SetterExclusionStrategy implements ExclusionStrategy {
    public boolean shouldSkipClass(Class<?> clazz) {
      return false;
    }
    public boolean shouldSkipField(FieldAttributes f) {
      return f.getName().startsWith("set");
    }
  }
}

원래 Gson 객체를 만드는 방법은 두 가지가 있습니다. new Gson () 은 기본 설정을 사용하여 Gson 객체를 만드는 것이지 GsonBuilder를 사용하는 경우입니다.create () 방법으로 만들면 설정을 사용자 정의할 수 있습니다. 이것은 주로 Gson이 특정한 상황에 더욱 적합하도록 만들기 위해서입니다.위의 첫 번째 파란색 코드는 Gson 대상을 만들었습니다. 이 대상은 "set"문자로 시작하는 속성에 대한 필터링 설정을 가지고 있습니다. (어떤 유형을 필터링해야 한다면 ExclusionStrategy 인터페이스의 shouldSkipClass(Classclazz) 방법을 다시 쓸 수 있습니다. 여러 가지 상황을 필터링해야 한다면 ExclusionStrategy 구현 대상을 몇 개 더 만들 수 있습니다.Gson 객체를 만들 때 설정하면 됨) 따라서 이 예에서 People 객체를 Json으로 변환할 때 속성 setName이 필터링됩니다.json1에 속성 setName이 없기 때문에 json1을 People 대상으로 반서열할 때 boolean 형식의 setName에 값이 없기 때문에 인쇄할 때 boolean 형식의 기본값을 찾았습니다.그래서 다음과 같은 결과가 나왔다.

{"name":"People","age":20}
{"name":"People","age":20,"setName":true}
name=People age=20 setName=false
name=People age=20 setName=true

Gson은 com에서 메모 사용도 지원합니다.google.gson.annotation 패키지에는 몇 개의 주석 Expose, SerializedName, Since와 Until이 있습니다. 각각의 역할이 있습니다. 다음은 공식 예를 사용하여 자주 사용하는 주석을 소개합니다.
Expose:
이 주석은 속성에 작용합니다. 서열화와 반서열화가 있을 때 이 속성은 Gson 대상에 노출됩니다.이 메모는 Gson 객체를 만들 때만 GsonBuilder 방식으로 GsonBuilder를 만들고 호출합니다.excludeFieldsWithoutExposeAnnotation() 메서드는 유효하지 않습니다. 그렇지 않으면 유효하지 않습니다.다음은 @Expose 메모를 사용하는 방법에 대한 예입니다.

public class User {
  @Expose private String firstName;
  @Expose(serialize = false) private String lastName;
  @Expose (serialize = false, deserialize = false) private String emailAddress;
  private String password;
}
만약 new Gson () 방식으로 Gson 대상을 만들면, toJson () 방법과fromJson () 방법은 서열화와 반서열화할 때 이 네 가지 속성을 조작합니다.하지만 Gson gson = new GsonBuilder () 를 사용한다면excludeFieldsWithoutExposeAnnotation().create () 는 Gson 대상을 만듭니다. Gson의 toJson () 과 fromJson () 방법은 password 필드를 제외합니다. 이것은 password 필드가 @Expose에 표시되지 않았기 때문입니다.이 Gson 대상은lastName과emailAddress 필드를 제외합니다. @Expose의 속성serialize가false로 설정되어 있기 때문입니다.이와 유사하게, Gson은 반서열화 시 이메일 주소 필드를 제외합니다. deserialize가false로 설정되어 있기 때문입니다.
SerializedName:
이 주석은 속성에 작용합니다. 이 속성이 Json으로 서열화될 때 이름을 주해의value 속성으로 서열화해야 하는 값을 나타냅니다.
이 메모는 기본 이름 정책을 포함하여 FieldNaming Policy를 덮어씁니다.다음은 @SerializedName 메모를 사용하는 방법에 대한 예입니다.

public class SomeClassWithFields {
  @SerializedName("name") private final String someField;
  private final String someOtherField;
  public SomeClassWithFields(String a, String b) {
   this.someField = a;
   this.someOtherField = b;
  }
}
다음 코드는 위의 테스트 클래스를 서열화한 결과를 보여 줍니다.

SomeClassWithFields objectToSerialize = new SomeClassWithFields("a", "b");
Gson gson = new Gson();
String jsonRepresentation = gson.toJson(objectToSerialize);
System.out.println(jsonRepresentation);
실행 결과:

{"name":"a","someOtherField":"b"}
이를 통해 알 수 있듯이 속성'someField'는'name'로 서열화되었다.
참고: @SerializedName의value에서 지정한 속성 이름은 유효한 Json 속성 이름이어야 합니다.

좋은 웹페이지 즐겨찾기