상세 컨텐츠

본문 제목

Chapter 9, JSON&YAML

본문

YAML이란?

구조를 가진 데이터의 표현 양식중 하나, 데이터를 형식에 맞춰 사용하여 데이터를 주고받을 때 서로 이해하게 하기 위해서 사용함

 

1. YAML 문법

YAML에서는 기본적으로 [key : value] 형태로 데이터를 정의합니다. 이때 : 뒤에는 키와 값을 구분하기위해 꼭 공백을 두어야합니다.

사용가능한 타입은 Numver, String, Boolean이있고, 문자열뒤에 \n , @ 등의 특수 문자가 포함된 경우에는 쌍따음표(" , ")를 사용하여 작성하여야 합니다.

Boolean값은 True/False 외에 On/Off 나 Yes/No로도 작성 가능합니다.

#주석 
Fruit: Apple
Quantity: 5
Origin: Chungju

위와같이 주석을 사용할때에는 #을 사용합니다.

 

2. Array/List

배열 혹은 리스트 구조를 표현할때에는 앞에 -를 붙여 사용합니다. -는 배열의 한요소를 가리킵니다. 이때 각 요소들은 순서가 중요합니다.

#1번
Fruits:
	- Orange
   	- Apple
  	- Banana

#2번
Fruits:
	- Apple
  	- Orange
  	- Banana

값이 동일하게 들어있지만, 순서가 다르므로 1번,2번은 같은 YAML파일이 아닙니다.

 

3. Dictionary / Map

계층 구조를 표현하고 싶은 경우에는 기본적으로 2칸, 4칸의 들여쓰기를 사용합니다. 들여쓰기를 할 때에는 각 아이템에 대해서 꼭 같은 수의 공백문자를 사용하여야합니다. 위의 Array/List 형식과는 다르게 요소들의 순서는 중요하지 않습니다.

#YAML

Fruits: 
	Name: Apple
	Quantity: 5
	Origin: Chungju

Vegetables:
	Name: Lettuces
	Quantity: 10
	Origin: Daekwan

위의 Name, Quantity, Origin은 각각 Fruits와 Vegetables에 속하는 것을 나타내기위에 들여쓰기를 잘해주여야합니다.

 

4. Advanced

위의 데이터 형식을 혼합하여 사용도 가능합니다.

#YAML

Fruits:
	- Banana: #Array/List
			Calories: 105 #Dictionary / Map
			Fat: 0.4g
			Carbs: 27g

	- Grape: #Array/List
			Calories: 62 #Dictionary / Map
			Fat: 0.3g
			Carbs: 15g

 

5. Multi-lines

값으로 여러 행의 문장을 작성할 때에는 기본적으로 \(역슬래쉬)n 을 사용합니다. 예를 들면 다음과 같습니다.

example: "kim \n han \n su"

다른 옵션으로는 > 와 | 가 있습니다.

>는 한줄을 모두 비웠을 때만 줄바꿈으로 인식하고, 그냥 줄바꿈을 할 때에는 공백 문자로 인식합니다.

#YAML

example1: >
  this is multiline string 
  and this is nextline 
  and nextline

example2: >
  this is multiline string 

  and this is nextline 
  and nextline
  
 #결과
 #JSON 

{
  "example1": "this is multiline string  and this is nextline  and nextline\n"
}


{
  "example2": "this is multiline string \nand this is nextline  and nextline\n"
}

| : 이 문자는 모든 줄바꿈을 인식하며, 마지막 문장의 끝도 마찬가지로 줄바꿈으로 인식합니다.

#YAML

example1: |
  this is multiline string 
  and this is nextline 
  and nextline
  
  #결과
 #JSON 

{
  "example1": "this is multiline string \nand this is nextline \nand nextline\n"
}

JSON이란?

JSON은 JavaScript Object Notation 의 줄임말로, 데이터의 교환을 위해 만들어진 객체 형태의 포맷입니다.

const message = {
  sender: "김코딩",
  receiver: "박해커",
  message: "해커야 오늘 저녁 같이 먹을래?",
  createdAt: "2021-01-12 10:10:10"
}

위의 예를 보면, message로 값을 넣어 데이터를 주고 받습니다.

 

전송가능한 조건은 다음과 같습니다.

  • 수신자(reciever)와 발신자(sender)가 같은 프로그램을 사용한다.
  • 또는, 문자열처럼 범용적으로 읽을 수 있어야 한다.

주의 : 객체는 타입 변환을 이용해 String으로 변환할 경우 객체 내용을 포함하지 않습니다. JavaScript에서 객체에 메소드( message.toString())나 형변환( String(message))을 시도하면, [object Object] 라는 결과를 리턴합니다. 이문제를 해결하려면 아래와같은 메소드를 이용하여야합니다.

  • JSON.stringify : Object type을 JSON으로 변환합니다.
  • JSON.parse : JSON을 Object type으로 변환합니다.
let transferableMessage = JSON.stringify(message)
console.log(transferableMessage)  // `{"sender":"김코딩","receiver":"박해커","message":"해커야 오늘 저녁 같이 먹을래?","createdAt":"2021-01-12 10:10:10"}`
console.log(typeof(transferableMessage)) // `string`

stringify하는 이러한 과정을 직렬화 라고 합니다.

 

JSON으로 변환된 객체(직렬화된 문자열)으로 상대방에서 보냈을 시 상대방은 어떻게 이 문자열을 다시 객체 형태로 만들수 있을까요?

 

JSON.stringify(직렬화)의 정반대의 기능을 수행하는 JSON.parse를 사용하여 객체의 형태로 변환합니다. 아래는 parse의 예시입니다.

let packet = `{"sender":"김코딩","receiver":"박해커","message":"해커야 오늘 저녁 같이 먹을래?","createdAt":"2021-01-12 10:10:10"}`

let obj = JSON.parse(packet)
console.log(obj)
/*
 * {
 * sender: "김코딩",
 * receiver: "박해커",
 * message: "해커야 오늘 저녁 같이 먹을래?",
 * createdAt: "2021-01-12 10:10:10"
 * }
 */
 console.log(typeof(obj))
 // `object

JSON.parse를 적용하는 이과정을 역직렬화 라고 합니다.

 

다음은 JSON의 기본 규칙입니다.

JSON은 자바스크립트의 객체와 별반 다를 바 없어보이지만, 자바스크립트의 객체와는 미묘하게 다른 규칙이 있습니다.

이외에도 JSON은 키와 값 사이, 그리고 키-값 쌍 사이에는 공백이 있어서는 안됩니다.

 

관련글 더보기