vodkassi 2021. 6. 5. 01:10
728x90

✨ JSON μ΄λž€?

Javascript Object Notation 의 μ•½μžλ‘œ, XML (Extensible Markup Language) μ΄λ‚˜ YAML κ³Ό 같은 데이터 ν˜•μ‹ (객체) 쀑 ν•˜λ‚˜μ΄λ‹€.

μš©λŸ‰μ΄ μž‘κ³  μ§κ΄€μ μœΌλ‘œ 읽고 μ“Έ 수 μžˆλ‹€λŠ” μž₯점 덕뢄에 λŒ€λΆ€λΆ„μ˜ μ›Ή API λ‚˜ Configuration νŒŒμΌμ— ν™œμš©λœλ‹€.

 

Javascript μ™€μ˜ ν˜Έν™˜μ„±λ„ λ†’μœΌλ©°, λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° 언어에 JSON 데이터λ₯Ό νŒŒμ‹±ν•  수 μžˆλŠ” λ‚΄μ™Έμž₯ λͺ¨λ“ˆμ΄ μ‘΄μž¬ν•œλ‹€. (ex: python 의 json λͺ¨λ“ˆ)

 

 

XML vs JSON

 

// xml

<?xml version="1.0" encoding="ISO-8859-1"?>  
<note>  
  <to>Tove</to>  
  <from>Jani</from>  
  <heading>Reminder</heading>  
  <body>Don't forget me this weekend!</body>  
</note>  

 

 

// JSON

{
  "squadName": "Super hero squad",
  "homeTown": "Metro City",
  "formed": 2016,
  "secretBase": "Super tower",
  "active": true,
  "members": [
    {
      "name": "Molecule Man",
      "age": 29,
      "secretIdentity": "Dan Jukes",
      "powers": [
        "Radiation resistance",
        "Turning tiny",
        "Radiation blast"
      ]
    }
  ]
}

 

✨ Supported Data Types (μ§€μ›λ˜λŠ” 데이터 νƒ€μž…)

- String, Numbers, Booleans, Null, Arrays, Objects

 

✨ Unsupported Data Types (μ§€μ›λ˜μ§€ μ•ŠλŠ” 데이터 νƒ€μž…)

- Infinity, NaN

 

✨ JSON rules (λͺ‡ 가지 κ·œμΉ™ 및 문법)

 

- JSON λ°μ΄ν„°λŠ” 기본적으둜 객체 (Object) ν˜•νƒœλ‘œ μ „λ‹¬λœλ‹€.

- λͺ¨λ“  String 은 κΌ­ double quote (" ") 둜 감싸주어야 ν•œλ‹€.

- Javascript λ‚΄ 일반적인 κ°μ²΄λ‚˜ λ°°μ—΄, λ¬Έμžμ—΄μ„ JSON.stringify() 둜 감싸쀀닀면 JSON 문법에 λ§žλŠ” JSON 객체λ₯Ό 얻을 수 μžˆλ‹€.

- JSON.stringify() μ‹œ Function, Symbol, 값이 undefined 인 ν”„λ‘œνΌν‹°λŠ” λ¬΄μ‹œλœλ‹€.

- μˆœν™˜ μ°Έμ‘°λ˜λŠ” 객체λ₯Ό stringify ν•˜λ €λ©΄ 쑰금 더 κΉŒλ‹€λ‘œμš΄ 방법을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€ (참고자료 μ°Έμ‘°)

 

JSON.stringify('haha') // '"haha"'
JSON.stringify({'one':'json'}) // '{"one":"json"}'
JSON.stringify(['one', 'haha']) // '["one", "haha"]'

let user = {  
  sayHi() { // λ¬΄μ‹œ  
  alert("Hello");  
  },  
  [Symbol("id")]: 123, // λ¬΄μ‹œ  
  something: undefined // λ¬΄μ‹œ  
};

alert( JSON.stringify(user) ); // {} (빈 객체가 좜λ ₯됨)

 

JSON으둜 인코딩 된 (직렬화 처리된 serialized, λ¬Έμžμ—΄λ‘œ λ³€ν™˜λœ stringified, μ§λ ¬ν™”λœ serialized) 객체λ₯Ό λ°˜λŒ€λ‘œ JSON ν™” ν•΄μ£ΌλŠ” λ©”μ„œλ“œλŠ” JSON.parse() 이닀.

 

✨ More about JSON.stringify()

 

JSON.stringify 의 λ§€κ°œλ³€μˆ˜λŠ” JSON.stringify(value, replacer, space) 이닀.

 

value : stringify ν•˜κΈΈ μ›ν•˜λŠ” κ°’

replacer : stringify ν•˜κΈΈ μ›ν•˜λŠ” ν”„λ‘œνΌν‹°κ°€ λ‹΄κΈ΄ λ°°μ—΄ λ˜λŠ” 맀핑 ν•¨μˆ˜

space : 곡백 문자 수

 

space 없이 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ²Œ 되면 λ°μ΄ν„°λŠ” 일렬둜 μ •λ ¬λ˜λ‚˜, 가독성을 높이길 μ›ν•œλ‹€λ©΄ space 의 κ°’λ§ŒνΌ λ“€μ—¬μ“°κΈ°λ₯Ό ν•΄ μ€€λ‹€.

 

let user = {
  name: "John",
  age: 25,
  roles: {
    isAdmin: false,
    isEditor: true
  }
};

JSON.stringify(user)
// '{"name":"John","age":25,"roles":{"isAdmin":false,"isEditor":true}}'

JSON.stringify(user, null, 2)
// '{\n' +
// ' "name": "John",\n' +
// ' "age": 25,\n' +
// ' "roles": {\n' +
  // ' "isAdmin": false,\n' +
  // ' "isEditor": true\n' +
// ' }\n' +
// '}'

 

Date κ°μ²΄μ—λŠ” λ‚΄μž₯ toJSON λ©”μ„œλ“œκ°€ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— stringify κ°€ κ°€λŠ₯ν•˜λ‹€.

 

JSON.stringify(new Date()) // '"2021-05-31T14:09:52.925Z"'

 

✨ 마무리 

EffectJS 과제λ₯Ό ν•˜λ©° μ „λ‹¬λ°›λŠ” 데이터 νƒ€μž…μ΄ json 인지 text 인지에 따라 νŒŒμ‹±ν•˜λŠ” 방법이 λ‹¬λΌμ§€λŠ” 점을 확인할 수 μžˆμ—ˆλ‹€. (μ΄λŠ” HTTP request, response 의 Content-type 에 영ν–₯을 λ°›λŠ”λ°, application/json 일 경우 json 데이터λ₯Ό μ£Όκ³ λ°›κ²Œ λ˜μ§€λ§Œ text/plain 인 경우 일반 string 데이터λ₯Ό μ£Όκ³ λ°›κ²Œ λœλ‹€.)

 

// Response 의 Content-type : Application/json
fetch('someurl').then(res => res.json()) // body λ₯Ό json 으둜 λ³€ν™˜

// Response 의 Content-type : text/plain  
fetch('someotherurl').then(res => res.text()) // body λ₯Ό string 으둜 λ³€ν™˜

 

JSON 객체의 νŠΉμ§•κ³Ό μš©λ„λ₯Ό 이둠적으둜 μ΄ν•΄ν•˜λŠ” 것은 비ꡐ적 μ‰¬μš°λ‚˜ HTTP 톡신에 직접 μ μš©ν•΄λ³΄λ €λ‹ˆ λ‹Ήν˜ΉμŠ€λŸ¬μš΄ μˆœκ°„μ΄ μ—¬λŸ¬ μ°¨λ‘€ μžˆμ—ˆλ‹€. JSON ν™” 된 데이터가 μ–΄λ–€ μ‹μœΌλ‘œ μ „λ‹¬λ˜μ–΄μ•Ό ν•˜λŠ”μ§€ μ •ν™•νžˆ μ΄ν•΄ν•˜μ§€ λͺ»ν–ˆκΈ° λ•Œλ¬Έμ— λ°œμƒν•œ μΌμ΄μ—ˆκΈ°μ— 이 κΈ°νšŒμ— 기본을 λ‹€μž‘κ³ μž ν–ˆλ‹€.

 

참고자료 

Learn JSON in 10 Minutes

JSON κ³Ό λ©”μ„œλ“œ