Gson - Arrays 및 Lists 객체 매핑
8461 단어 기술 번역
우리 Gson 시리즈의 또 다른 글에 오신 것을 환영합니다. Gson의 기초적인 용법을 되돌아본 후에 예를 들어 모델 주석과 끼워 넣은 대상의 비주얼, 본고의 중점 기능인 수조와 목록 대상의 비주얼을 토론합니다. 우리는 거의 이런 데이터 유형을 사용할 것입니다. 다행히도 Gson은 우리를 쉽게 해결할 수 있습니다.
Array와 List의 차이점
서열화를 소개하기 전에 자바의 두 가지 데이터 구조인 Array와 List를 살펴보겠습니다.자바에서 두 가지 실현 방식이 다르고 어떤 데이터 유형을 사용하느냐는 당신의 실제 수요에 달려 있지만 서열화 문제에 있어서 Gson은 이 두 가지 데이터 구조의 구체적인 실현에 관심이 없다.
JSON 데이터 형식에 수조 등 구조가 존재하지 않고 자바의 구체적인 실현으로 인해 이 두 가지 데이터 유형은 크게 다르다.그러나 상부에서 똑같은 구조를 나타낸다. 다음에 우리는 이 두 가지 데이터 유형을 다시 이해할 것이다. 몇 가지 예를 본 후에 알 수 있다.
Array 및 List 시리얼화
지난 restaurant 모델에 대한 플러그인 대상 기억나세요?다음은 두 필드를 포함하는menu 속성을 추가합니다.restaurant의 메뉴는restaurant 목록으로 이해할 수 있습니다.다음과 같습니다.
힌트: 간단한 메뉴의 예일 뿐입니다. 이 데이터 구조는 완전한 데이터가 아니기 때문에 실제적으로 사용할 수 없습니다.
먼저 Java model 클래스를 만듭니다.
public class RestaurantWithMenu {
String name;
List menu;
//RestaurantMenuItem[] menu; // alternative, either one is fine
}
public class RestaurantMenuItem {
String description;
float price;
}
객체를 네스트하는 방식으로 Java Model에 매핑할 변수에 대한 참조를 포함하면 됩니다. 이름은 JSON의 필드 이름과 동일합니다.
JSON 형식은 다음과 같습니다.
{
"name": "Future Studio Steak House",
"menu": [
...
]
}
중첩된 대상과 유사하게 우리는menu의 직접적인 값이 없고 반대로 JSON에는'[]'을 통해 하나의 대상을 포함한다. 위에서 말한 바와 같이 JSON 데이터에서 수조와List 구조는 차이가 없다.
menu에는 일부 대상이 포함되어 있습니다. 우리 모델에서menu는 그 중의 변수일 뿐입니다. 우리는 먼저 완전한 JSON 데이터를 수동으로 생성합니다.
다음과 같은 방법으로 전체 Restaurant 데이터를 시뮬레이션합니다.
List menu = new ArrayList<>();
menu.add(new RestaurantMenuItem("Spaghetti", 7.99f));
menu.add(new RestaurantMenuItem("Steak", 12.99f));
menu.add(new RestaurantMenuItem("Salad", 5.99f));
RestaurantWithMenu restaurant = new RestaurantWithMenu("Future Studio Steak House", menu);
Gson gson = new Gson();
String restaurantJson = gson.toJson(restaurant);
다음과 같이 JSON을 생성합니다.
{
"menu": [
{
"description": "Spaghetti",
"price": 7.99
},
{
"description": "Steak",
"price": 12.99
},
{
"description": "Salad",
"price": 5.99
}
],
"name": "Future Studio Steak House"
}
예상대로 원하는 데이터를 얻었습니다. 알파벳순으로menu는name의 앞에 배열되었고, "[]"로고List에 따라 시작하고, "{}"로고의 대상에 따라 시작합니다.
그러나 우리가 항상 리스트를 대상에 끼워 넣는 것은 아니다. 우리는 리스트를 직접 얻을 수 있고 Gson도 리스트를 직접 서열화하는 것을 지원한다.
List menu = new ArrayList<>();
menu.add(new RestaurantMenuItem("Spaghetti", 7.99f));
menu.add(new RestaurantMenuItem("Steak", 12.99f));
menu.add(new RestaurantMenuItem("Salad", 5.99f));
Gson gson = new Gson();
String menuJson = gson.toJson(menu);
출력:
[
{
"description": "Spaghetti",
"price": 7.99
},
{
"description": "Steak",
"price": 12.99
},
{
"description": "Salad",
"price": 5.99
}
]
데이터의 차이를 살펴보자. JSON의'['는 하나의 대상 목록이 시작되었다는 것을 의미한다. {'는 하나의 대상이 시작되었다는 것을 의미한다. 우리는 JSON 데이터의 형식 차이를 기억해야 한다.
배열 및 List 반서열화
두 번째 부분에서 우리는 반서열화를 배울 것이다. 우리는 Gson을 이용하여 목록 데이터를 분석할 것이다. 이전의 예에서 우리는 두 가지 상황을 열거했다. 하나는 목록을 굽은 노드로 하고 다른 하나는 목록이 가장 끼워 넣는 대상이다.
List 를 노드로
목록의 가장 근접한 예를 보십시오:
[
{
"name": "Christian",
"flowerCount": 1
},
{
"name": "Marcus",
"flowerCount": 3
},
{
"name": "Norman",
"flowerCount": 2
}
]
앞에서 설명한 바와 같이'[]'는 GSON 해석 목록의 시작과 끝을 표시하고 구체적인 자바 모델 클래스가 필요합니다.
public class Founder {
String name;
int flowerCount;
}
다음에 우리는 데이터를 우리가 원하는 데이터 형식으로 해석할 것이다.
배열:
먼저 수조로 해석하고 Gson의 gson을 통해fromJson 방법은 GSON을 간단하게 수조로 해석하는데 여기서 전달하는 매개 변수는Founder[]입니다.class가 Founder가 아니라class:
String founderJson = "[{'name': 'Christian','flowerCount': 1}, {'name': 'Marcus', 'flowerCount': 3}, {'name': 'Norman', 'flowerCount': 2}]";
Gson gson = new Gson();
Founder[] founderArray = gson.fromJson(founderJson, Founder[].class);
Debug은 다음과 같습니다.
Lists
실제 개발에서 우리는 Array List로 전환하는 것이 더 많다. 그러나 우리는 수조를 해석하는 것처럼 List에 전송할 수 없다. Gson이 우리가 해석하고자 하는 데이터 유형을 알게 하기 위해 우리는 그에게 Type를 전달해야 한다. 내부는 TypeToken에 따라 해석하고자 하는 유형을 구분해야 한다.예를 들면 다음과 같습니다.
Type founderListType = new TypeToken>(){}.getType();
해결은 다음과 같습니다.
String founderJson = "[{'name': 'Christian','flowerCount': 1}, {'name': 'Marcus', 'flowerCount': 3}, {'name': 'Norman', 'flowerCount': 2}]";
Gson gson = new Gson();
Type founderListType = new TypeToken>(){}.getType();
List founderList = gson.fromJson(founderJson, founderListType);
Debug은 다음과 같습니다.
상기 두 가지 방식은 자신의 실제 수요에 따라 선택한다.다음은 반서열화 조작을 살펴보자.
#### 목록은 객체의 일부입니다.
우리는 지금 이런 데이터를 가지고 있다.
{
"name": "Future Studio Dev Team",
"website": "https://futurestud.io",
"founders": [{
"name": "Christian",
"flowerCount": 1
}, {
"name": "Marcus",
"flowerCount": 3
}, {
"name": "Norman",
"flowerCount": 2
}]
}
항상 해당되는 Java Model 클래스를 만들어야 합니다.
public class GeneralInfo {
String name;
String website;
List founders;
}
목록에 모델 클래스가 존재하는 장점 중 하나는 Gson 해석을 사용할 때 TypeToken을 전달하지 않고 클래스에 직접 들어가면 된다는 것이다.
String generalInfoJson = "{'name': 'Future Studio Dev Team', 'website': 'https://futurestud.io', 'founders': [{'name': 'Christian', 'flowerCount': 1 }, {'name': 'Marcus','flowerCount': 3 }, {'name': 'Norman','flowerCount': 2 }]}";
Gson gson = new Gson();
GeneralInfo generalInfoObject = gson.fromJson(generalInfoJson, GeneralInfo.class);
Debug은 다음과 같습니다.
List 이외에도 배열 형식으로 해석할 수 있습니다.
List의 중첩 List
Gson은 또한 List에 중첩된 List 데이터 구조를 해석할 수 있습니다. 예를 들어 다음과 같습니다.
public class GeneralInfo {
String name;
String website;
List founders;
}
public class FounderWithPets {
String name;
int flowerCount;
List pets;
}
public class Pet {
String name;
List toys;
}
JSON에는 세 개의 리스트가 포함되어 있는데 여기는 조작하지 않습니다. Gson도 해석할 수 있을 거라고 믿습니다.우리가 해석해야 할 유형의 전달이 정확하기만 하면 된다.
목표
본고는 Gson을 사용하여 Array List와 그룹을 서열화하고 반서열화하는 방법을 알고 JSON 형식의 차이에 따라 대상인지 대상 집합인지 판단하는 방법을 알게 될 것이다.
댓글이나 트위터@futurestudio가 당신의 문제를 피드백합니다.
연습 코드가 Github에 업로드됨https://github.com/whiskeyfei/Gson-Review직접 확인할 수 있습니다.
Gson 시리즈 문장 번역 회고
1. Gson-Java-JSON 서열화 및 반서열화 입문 2, Gson-映射 끼워넣기 대상 3, Gson-Arrays와 Lists 映射 대상 4, Gson-Map 구조 映射 5, Gson-Set 집합 映射 6, Gson-빈 값 映射 7, Gson Model Annotations - @SerializedName을 사용하여 세그먼트의 명칭을 바꾸는 방법 8, Gson Model Annotations-@serializedName이 여러 개의 반서열화 명칭과 일치하는 방법 9,Gson Builder - 기본 및 명명 규칙 10, Gson Builder - 서열화 공백 값 11, Gson Builder - 무시 정책 12, Gson Builder - Gson Lenient 속성 13, Gson Builder - 특수 유형 Floats & Doubles 17, Gson Builder - @Expose 무시 필드 19, Gson Advanced - 매핑 매핑 유형 20, Gson Advanced - 매핑 순환 참조 21, Gson Advanced - 범용 22, Gson AdvancedGson Advanced - 단순 사용자 정의 서열화(Part 1) 24, Gson Advanced - 사용자 정의 반서열화 기초 25, Gson Advanced - 사용자 정의 대상 실례 만들기 26, Gson Advanced - @Json Adapter를 통해 사용자 정의(반) 서열화 과정 32, Practical Gson - 다태 대상 해석 방법