[java] JSON과 GSON

young-gue Park·2023년 8월 4일
0

Java

목록 보기
11/11
post-thumbnail

⚡ JSON과 GSON


📌 JSON

🔷 JavaScript Object Notation

  • 자바스크립트를 토대로 개발
  • 여러 프로그래밍 언어에서 사용할 수 있는 독립형 언어
  • 웹 클라이언트와 웹 서버 간 데이터 교환에 사용
  • 웹 브라우저 비동기 처리에 사용되는 AJAX의 데이터 교환 형식으로 널리 알려짐
  • IETF RFC 7159, ECMA-404 표준으로 제정

🔷 왜 JSON인가?

  • 주요 프론트엔드 프레임워크에 의해서 지원된다.

  • 공식 포맷이기 때문에 개발자 사이에 데이터 통신을 할 수 있다.

  • 텍스트로 이루어져 있어 읽고 쓰기 쉽다.

  • XML에 비해 용량이 적고 이해하기 쉽다.

  • 언어와 플랫폼에 독립적이므로, 서로 다른 시스템 간 데이터 교환에 좋다.

    ⭐ JSON 구조와 변환

🔷 JSON은 key, value의 쌍으로 표현한다.

 {"key": value, ...}
 // key는 ""로 묶어서 표현
 // value는 String일 경우 ""로 묶어서 표현

🔷 value로 object, array, number, string, true, false, null 사용

 // object
 {"id": "Bzeromo", "name": "younggue"}
 
 // Array
 ["hong", "kim", "park", "lee"]
let student = {
    name: "박영규",
    age: 25,
    hobbies: ["노래하기", "유튜브", "LOL"],
}

console.log(student);
//{name: '박영규', age: 25, hobbies: Array(3)}

// JSON String
// JSON.stringify
let str = JSON.stringify(student);
console.log(str);
// {"name":"박영규","age":25,"hobbies":["노래하기","유튜브","LOL"]}

// JSON.string(data) => JavaScript Object
// JSON.parse
let someStr = '{"name":"박영규","age":25,"hobbies":["노래하기","유튜브","LOL"]}';
let student2 = JSON.parse(someStr);
console.log(student2);
// {name: '박영규', age: 25, hobbies: Array(3)}

console.log(typeof(student)) // object
console.log(typeof(str)) // string
console.log(typeof(someStr)) // string
console.log(typeof(student2)) // object

let arr = ["kim", "lee", "yeo", "jeon"];

str = JSON.stringify(arr);
arr.forEach((student) => console.log(student));
// kim
// lee
// yeo
// jeon

// map, filter
// map -> 새로운 배열 생성
// filter -> 원하는 값만 골라내서 새로운 배열을 만들 때
let arr2 = [1, 2, 3, 4];

let arr3 = arr2.map((num) => {
    return num + 2;
})
console.log(arr3);
// [3, 4, 5, 6]

let arr4 = arr2.filter((num) => num%2===0);
console.log(arr4);
// [2, 4]

🔷 클래스 객체와 JSON 변환

  • class <-> {}
  • Array, List <-> []

📌 GSON 라이브러리

🔷 Java 객체를 JSON 표현으로 변환하는데 사용할 수 있는 라이브러리

  • JSON 문자열을 JAVA 객체로, JAVA 객체를 JSON 문자열로 변환하는 간단한 방법을 제공한다. (toJson(), fromJson())
  • Gson을 사용하기 위해서 라이브러리를 다운받고 프로젝트에 인식시켜야 한다.

🔷 외부 라이브러리(GSON) 인식시키기

  1. JRE System Library에 끼워넣기 (좋은 방법이 아님)
  2. 프로젝트 외부에 있는 jar 파일을 인식시키기
    • 프로젝트를 이사할 때 인식되지 않을 수 있음
  3. 프로젝트 내부에 jar 파일을 복사, 인식시키기
    • 프로젝트 우클릭 -> Build path -> Configure Build Path
    • Library 탭 -> ADD JARS
  4. Maven 프로젝트로 변경 후 pom.xml에 dependency 추가
package JSON;

public class Person {
	private String name;
	private int age;
	
	public Person() {}
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	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;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}

package JSON;

import com.google.gson.Gson;

public class Test {
	public static void main(String[] args) {
		Gson gson = new Gson();
		
		// 객체 => json 문자열
		Person p1 = new Person("박영규", 25);
		Person p2 = new Person("박민정", 22);
		Person p3 = new Person("안상준", 27);
		
		String p1Str = gson.toJson(p1);
		String p2Str = gson.toJson(p2);
		String p3Str = gson.toJson(p3);
		
		System.out.println(p1);
		System.out.println(p2);
		System.out.println(p3);
//		Person [name=박영규, age=25]
//		Person [name=박민정, age=22]
//		Person [name=안상준, age=27]
		
		System.out.println(p1Str);
		System.out.println(p2Str);
		System.out.println(p3Str);
//		{"name":"박영규","age":25}
//		{"name":"박민정","age":22}
//		{"name":"안상준","age":27}
		
		
	}

}
  • 문자열을 객체로
package JSON;

import com.google.gson.Gson;

public class Test2 {

	public static void main(String[] args) {
		Gson gson = new Gson();
		
		// json 문자열 => 자바 객체
		// gson.fromJson("문자열", 타입.class)
		
		String str1 = "{\"name\":\"박영규\", \"age\":25}";
		String str2 = "{\"name\":\"박민정\", \"age\":23}";
		String str3 = "{\"name\":\"박재민\", \"age\":30}";
		
		Person p1 = gson.fromJson(str1, Person.class);
		Person p2 = gson.fromJson(str2, Person.class);
		Person p3 = gson.fromJson(str3, Person.class);
		
		System.out.println(str1);
		System.out.println(str2);
		System.out.println(str3);
//		{"name":"박영규", "age":25}
//		{"name":"박민정", "age":23}
//		{"name":"박재민", "age":30}
		
		System.out.println(p1);
		System.out.println(p2);
		System.out.println(p3);
//		Person [name=박영규, age=25]
//		Person [name=박민정, age=23]
//		Person [name=박재민, age=30]
	}

}
  • 객체 리스트 이용
package JSON3;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class Test {
	// 여러 개의 객체를 배열에 넣고 Json 형식으로 변환시키기
	// Json 형식의 문자열을 객체로 만들어 배열 안에 넣기
	public static void main(String[] args) {
		List<Person> list = new ArrayList<Person>();
		list.add(new Person("박영규", 25));
		list.add(new Person("박영순", 85));
		list.add(new Person("박영호", 28));
		list.add(new Person("박영찬", 30));
		list.add(new Person("박영준", 25));
		list.add(new Person("박영희", 55));
		list.add(new Person("박영선", 48));
		list.add(new Person("박영진", 37));
		
		System.out.println(list);
//		[Person [name=박영규, age=25], ... ]
		
		Gson gson = new Gson();
		String str = gson.toJson(list);
		System.out.println(str);
//		[{"name":"박영규","age":25},{"name":"박영순","age":85}, ... ]
		
		String str2 = "[{\"name\":\"박영규\",\"age\":25},{\"name\":\"박영순\",\"age\":85},{\"name\":\"박영호\",\"age\":28},{\"name\":\"박영찬\",\"age\":30},{\"name\":\"박영준\",\"age\":25},{\"name\":\"박영희\",\"age\":55},{\"name\":\"박영선\",\"age\":48},{\"name\":\"박영진\",\"age\":37}]";
		Person [] arr = gson.fromJson(str2, Person[].class);
		System.out.println(Arrays.toString(arr));
//		[Person [name=박영규, age=25], Person [name=박영순, age=85], ... ]
		
		Type listType = new TypeToken<ArrayList<Person>>() {}.getType();
		List<Person>list2 = gson.fromJson(str2, listType);
		System.out.println(list2);
// 		[Person [name=박영규, age=25], Person [name=박영순, age=85], ... ]
	}

}
  • 파일 읽고 쓰기
package JSON4;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;

import com.google.gson.Gson;

public class Test {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("data/refrigerator.json")));
		// 파일의 모든 행의 문자열을 다 모아야 하므로 StringBuilder 사용
		StringBuilder sb = new StringBuilder();
		String str = null; // 한줄씩 읽어왔을 때 문자열 임시 저장 변수
		while((str = br.readLine()) != null) {
			sb.append(str).append("\n");
		}
		// sb에 모든 문자열이 모여있음
		Gson gson = new Gson();
		Refrigerator [] arr = gson.fromJson(sb.toString(), Refrigerator[].class);
		System.out.println(Arrays.toString(arr));
//		[Refrigerator [pCoed=null, pName=S냉장고, price=1000000, quantity=20, brand=삼성, desc=삼성에서 출시한 스마트 냉장고입니다., category=냉장고, liter=1000, freezer=true, year=2021], ... ]
		
		arr[0].setPrice(2000000);
		
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("data/refrigerator-newjson")));
		String str2 = gson.toJson(arr);
		bw.write(str2);
		bw.close();
	}
}

profile
Hodie mihi, Cras tibi

0개의 댓글