Java의 JSON 변환 라이브러리 GSON의 기본 사용 강좌
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 속성 이름이어야 합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.