🍭

8. JSON

Index

Β 

8. JSON

8.1 JSON μ΄λž€?

Β 
JSON(JavaScript Object Notation)은 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 객체λ₯Ό ν‘œν˜„ν•˜λŠ” ν˜•μ‹μœΌλ‘œ 데이터λ₯Ό ν‘œν˜„ν•œκ²ƒμž…λ‹ˆλ‹€. λ‹€λ₯Έ 방식에 λΉ„ν•΄ 가볍고 μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ ν˜Έν™˜μ„±μ΄ λ†’μ•„ 널리 μ‚¬μš©λ©λ‹ˆλ‹€. μ‰½κ²Œ 말해 ν…μŠ€νŠΈλ‘œ ν‘œν˜„λœ μ •λ³΄μ˜ 덩어리라고 μƒκ°ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.
Β 
JSON 의 기본적인 ν˜•νƒœ
{ "squadName": "μŠˆνΌνžˆμ–΄λ‘œ", "members": [ { "name": "아이언맨", "age": 29, "λ³Έλͺ…": "ν† λ‹ˆ μŠ€νƒ€ν¬" }, { "name": "헐크", "age": 39, "λ³Έλͺ…": "λΆ€λ₯΄μŠ€ λ°°λ„ˆ" } ] }
Β 

8.2 탄생 λ°°κ²½

ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ€ μ–Έμ–΄λ§ˆλ‹€ λ‹€λ₯Έ ν‘œν˜„λ°©μ‹ λ•Œλ¬Έμ— 정보λ₯Ό μ „λ‹¬ν•˜λŠ”λ° μ• λ₯Ό λ¨ΉμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ λ°°μ—΄ λ°μ΄ν„°μ˜ ν‘œν˜„λ°©μ‹μ€ μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ CλŠ” λ‹€λ¦…λ‹ˆλ‹€. ν•˜μ§€λ§Œ μˆ«μžμ™€ λ¬Έμžμ—΄μ€ μ–Έμ–΄λ§ˆλ‹€ ν‘œν˜„λ°©μ‹μ΄ 같은데 이λ₯Ό μ΄μš©ν•΄μ„œ λ§Œλ“  λŒ€ν‘œμ μΈ 데이터 폼이 xmlμž…λ‹ˆλ‹€. 후에 λ³΅μž‘ν•œ ꡬ쑰λ₯Ό 더 λ‹¨μˆœνžˆ ν•˜κ³ μž νƒ„μƒν•œ 것이 JSON μž…λ‹ˆλ‹€.
Β 
같은 데이터λ₯Ό κ°€μ§€λŠ” JSON κ³Ό xml 비ꡐ
{ "squadName": "μŠˆνΌνžˆμ–΄λ‘œ", "members": [ { "name": "아이언맨", "age": 29, "λ³Έλͺ…": "ν† λ‹ˆ μŠ€νƒ€ν¬" }, { "name": "헐크", "age": 39, "λ³Έλͺ…": "λΆ€λ₯΄μŠ€ λ°°λ„ˆ" } ] }
<?xml version="1.0" encoding="UTF-8" ?> <root> <squadName>μŠˆνΌνžˆμ–΄λ‘œ</squadName> <members> <name>아이언맨</name> <age>29</age> <λ³Έλͺ…>ν† λ‹ˆ μŠ€νƒ€ν¬</λ³Έλͺ…> </members> <members> <name>헐크</name> <age>39</age> <λ³Έλͺ…>λΆ€λ₯΄μŠ€ λ°°λ„ˆ</λ³Έλͺ…> </members> </root>
Β 

8.3 JSON λ©”μ„œλ“œ

  • JSON.parse(): JSONλ¬Έμžμ—΄μ„ μžλ°”μŠ€ν¬λ¦½νŠΈ 객체둜 λ³€ν™˜ν•©λ‹ˆλ‹€.
  • JSON.stringify() : μžλ°”μŠ€ν¬λ¦½νŠΈ 객체λ₯Ό JSONλ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.
// JSON을 μ΄μš©ν•œ κΉŠμ€ 볡사 let l = [10, 20, 30]; let a = JSON.parse(JSON.stringify(l)); a[0] = 1000; console.log(l);
Β 
JSON μ‘μš©1
const ν˜Έν…” = [{ '이름' : 'ν•˜λ‚˜ν˜Έν…”', 'μœ„μΉ˜' : 'μ œμ£Όλ„ μ œμ£Όμ‹œ 001', '가격' : {'A':50000, 'B':30000, 'C':15000}, '방의개수' : 50, 'μ˜ˆμ•½μžμˆ˜' : 25, 'λ‚¨μ€λ°©μ˜κ°œμˆ˜' : function(){return this.방의개수 - this.μ˜ˆμ•½μžμˆ˜} },{ '이름' : 'λ‘˜ν˜Έν…”', 'μœ„μΉ˜' : 'μ œμ£Όλ„ μ œμ£Όμ‹œ 002', '가격' : {'A':100000, 'B':60000, 'C':30000}, '방의개수' : 100, 'μ˜ˆμ•½μžμˆ˜' : 30, 'λ‚¨μ€λ°©μ˜κ°œμˆ˜' : function(){return this.방의개수 - this.μ˜ˆμ•½μžμˆ˜} },{ '이름' : 'μ…‹ν˜Έν…”', 'μœ„μΉ˜' : 'μ œμ£Όλ„ μ œμ£Όμ‹œ 003', '가격' : {'A':80000, 'B':50000, 'C':30000}, '방의개수' : 120, 'μ˜ˆμ•½μžμˆ˜' : 80, 'λ‚¨μ€λ°©μ˜κ°œμˆ˜' : function(){return this.방의개수 - this.μ˜ˆμ•½μžμˆ˜} }]; console.log(ν˜Έν…”.filter(ν˜Έν…” => (ν˜Έν…”.이름 =='μ…‹ν˜Έν…”'))); console.log(ν˜Έν…”.map(ν˜Έν…” => ({ '이름' : ν˜Έν…”.이름, 'μœ„μΉ˜' : ν˜Έν…”.μœ„μΉ˜, '가격' : ν˜Έν…”.가격, '방의개수' : ν˜Έν…”.방의개수, 'μ˜ˆμ•½μžμˆ˜' : ν˜Έν…”.μ˜ˆμ•½μžμˆ˜, //λ¬Όλ‘  이름을 λΆ™μ΄λŠ” κ°„λ‹¨ν•œ μ—°μ‚° 뿐만 μ•„λ‹ˆλΌ, λ‚˜λΌλ³„ μ‹œκ°„ ν‘œκΈ°λ²•μ„ λ³„λ„λ‘œ ν‘œμ‹œν•΄μ€€λ‹€λ˜μ§€ μ’€ 더 λ³΅μž‘ν•œ 연산도 κ°€λŠ₯ 'λ‚¨μ€λ°©μ˜κ°œμˆ˜' : ν˜Έν…”.방의개수 - ν˜Έν…”.μ˜ˆμ•½μžμˆ˜ }))); let a = [5, 4, 3, 2, 1]; console.log(a.sort((a, b) => (a - b))); console.log(ν˜Έν…”.sort((a, b) => (a.방의개수 - b.방의개수)));
Β 
JSON μ‘μš©2
<button onclick="renderTable(jsonData)">데이터 호좜!</button> <table id="renderingDataTable"> <thead> <tr> <th onclick="sort('_id')">_id</th> <th onclick="sort('age')">age</th> <th onclick="sort('eyeColor')">eyeColor</th> <th onclick="sort('name')">name</th> <th onclick="sort('gender')">gender</th> <th onclick="sort('email')">email</th> <th onclick="sort('phone')">phone</th> </tr> </thead> <tbody></tbody> </table>
var jsonData = [ { "_id": "5e80777f673acf89c007ff91", "age": 27, "eyeColor": "green", "name": "Angelina Chang", "gender": "female", "email": "angelinachang@kangle.com", "phone": "+1 (938) 477-2821" }, { "_id": "5e80777feee717674b817fd2", "age": 25, "eyeColor": "green", "name": "Deidre Cobb", "gender": "female", "email": "deidrecobb@kangle.com", "phone": "+1 (938) 477-2824" }, { "_id": "5e80777fac368a4578dda85d", "age": 25, "eyeColor": "blue", "name": "Jolene Franks", "gender": "female", "email": "jolenefranks@kangle.com", "phone": "+1 (985) 536-3981" }, { "_id": "5e80777ff3717874cbc78e44", "age": 31, "eyeColor": "brown", "name": "Waters Hardin", "gender": "male", "email": "watershardin@kangle.com", "phone": "+1 (938) 559-2224" }, { "_id": "5e80777fe36842ea9e024fcd", "age": 34, "eyeColor": "green", "name": "Jody Chaney", "gender": "female", "email": "jodychaney@kangle.com", "phone": "+1 (878) 587-2602" }, { "_id": "5e80777fafd591f57344eb33", "age": 31, "eyeColor": "green", "name": "Ortiz Maldonado", "gender": "male", "email": "ortizmaldonado@kangle.com", "phone": "+1 (986) 509-2753" }, { "_id": "5e80777f20e48e9ada226862", "age": 25, "eyeColor": "brown", "name": "Stacy Burris", "gender": "female", "email": "stacyburris@kangle.com", "phone": "+1 (864) 577-3500" }, { "_id": "5e80777faf334f84a2c90595", "age": 33, "eyeColor": "brown", "name": "Davenport Levy", "gender": "male", "email": "davenportlevy@kangle.com", "phone": "+1 (990) 600-2700" }, { "_id": "5e80777fe9d516f0da793b7e", "age": 32, "eyeColor": "brown", "name": "Lenora Rivas", "gender": "female", "email": "lenorarivas@kangle.com", "phone": "+1 (835) 549-3209" }, { "_id": "5e80777fba91e9aeeb5ce989", "age": 35, "eyeColor": "brown", "name": "John Fischer", "gender": "female", "email": "johnfischer@kangle.com", "phone": "+1 (969) 493-3495" }, { "_id": "5e80777f63b89c8cb73127b8", "age": 23, "eyeColor": "brown", "name": "Aurora Robles", "gender": "female", "email": "aurorarobles@kangle.com", "phone": "+1 (900) 579-2424" }, { "_id": "5e80777faac1a3f50eacfbd1", "age": 20, "eyeColor": "brown", "name": "Solis Hays", "gender": "male", "email": "solishays@kangle.com", "phone": "+1 (930) 450-2123" }, { "_id": "5e80777ffd19fbf487e3957c", "age": 26, "eyeColor": "blue", "name": "Graves Jackson", "gender": "male", "email": "gravesjackson@kangle.com", "phone": "+1 (810) 556-3478" }, { "_id": "5e80777ff3bd76dd30824028", "age": 22, "eyeColor": "brown", "name": "Sharron Joyner", "gender": "female", "email": "sharronjoyner@kangle.com", "phone": "+1 (991) 418-2210" }, { "_id": "5e80777fd0f579261a830c2f", "age": 37, "eyeColor": "brown", "name": "Patty Bernard", "gender": "female", "email": "pattybernard@kangle.com", "phone": "+1 (940) 558-3881" }, { "_id": "5e80777fba4fc442f7353d84", "age": 23, "eyeColor": "brown", "name": "Sandra Foreman", "gender": "female", "email": "sandraforeman@kangle.com", "phone": "+1 (864) 500-3123" }, { "_id": "5e80777fa0897694765e4040", "age": 35, "eyeColor": "blue", "name": "Hyde Melendez", "gender": "male", "email": "hydemelendez@kangle.com", "phone": "+1 (964) 487-2694" }, { "_id": "5e80777fcf1f69b3350b06c1", "age": 40, "eyeColor": "green", "name": "Evans Wagner", "gender": "male", "email": "evanswagner@kangle.com", "phone": "+1 (944) 448-3591" }, { "_id": "5e80777fd311822be4597959", "age": 40, "eyeColor": "brown", "name": "Robinson Lynn", "gender": "male", "email": "robinsonlynn@kangle.com", "phone": "+1 (983) 564-3761" }, { "_id": "5e80777f481e9934e9fabdce", "age": 27, "eyeColor": "brown", "name": "Best Ewing", "gender": "male", "email": "bestewing@kangle.com", "phone": "+1 (950) 477-3573" }, { "_id": "5e80777fbf35be0eb2c2360a", "age": 22, "eyeColor": "green", "name": "Bird Long", "gender": "male", "email": "birdlong@kangle.com", "phone": "+1 (843) 497-2151" }, { "_id": "5e80777f37564dd622dfac58", "age": 35, "eyeColor": "green", "name": "Flynn Albert", "gender": "male", "email": "flynnalbert@kangle.com", "phone": "+1 (835) 422-2151" }, { "_id": "5e80777fa4080ca9c9a2a8f7", "age": 39, "eyeColor": "brown", "name": "Avila Chen", "gender": "male", "email": "avilachen@kangle.com", "phone": "+1 (985) 515-2235" }, { "_id": "5e80777fbf2492c1f4f6c7d2", "age": 38, "eyeColor": "green", "name": "Colette Sweet", "gender": "female", "email": "colettesweet@kangle.com", "phone": "+1 (971) 578-3870" }, { "_id": "5e80777f9dc7e14e19c042a7", "age": 39, "eyeColor": "brown", "name": "Deirdre Reilly", "gender": "female", "email": "deirdrereilly@kangle.com", "phone": "+1 (832) 546-2673" }, { "_id": "5e80777f28590be173115fdf", "age": 38, "eyeColor": "blue", "name": "Carpenter Kaufman", "gender": "male", "email": "carpenterkaufman@kangle.com", "phone": "+1 (963) 452-3989" }, { "_id": "5e80777fa4062298ee3772aa", "age": 30, "eyeColor": "green", "name": "Angela Cote", "gender": "female", "email": "angelacote@kangle.com", "phone": "+1 (868) 471-3444" }, { "_id": "5e80777fe70152016f07e965", "age": 24, "eyeColor": "blue", "name": "Carter Mueller", "gender": "male", "email": "cartermueller@kangle.com", "phone": "+1 (943) 492-2942" }, { "_id": "5e80777f162e512bf3be2b7e", "age": 35, "eyeColor": "blue", "name": "Nola Hancock", "gender": "female", "email": "nolahancock@kangle.com", "phone": "+1 (851) 523-2333" }, { "_id": "5e80777f178b7460aeb79784", "age": 35, "eyeColor": "green", "name": "Mcconnell Mosley", "gender": "male", "email": "mcconnellmosley@kangle.com", "phone": "+1 (807) 460-2627" } ]; var click = true; function sort(key){ if (click) { click = false; let sortedData = jsonData.sort((a, b) => (a[key] < b[key] ? -1 : (a[key] > b[key] ? 1 : 0))); renderTable(sortedData); } else { click = true; let sortedData = jsonData.sort((a, b) => (a[key] > b[key] ? -1 : (a[key] < b[key] ? 1 : 0))); renderTable(sortedData); } } function renderTable(data){ let tableBodyData = []; console.log('?') for (var variable of data) { tableBodyData.push(` <tr> <td>${variable._id}</td> <td>${variable.age}</td> <td>${variable.eyeColor}</td> <td>${variable.name}</td> <td>${variable.gender}</td> <td>${variable.email}</td> <td>${variable.phone}</td> </tr> `) } document.querySelector('#renderingDataTable > tbody').innerHTML = tableBodyData.join(''); }
Β 
JSON μ‘μš© 3
<button onclick="renderTable(ν˜Έν…”)" type="button" name="button">클릭해!!</button> <table id="rederingDataTable"> <thead> <tr> <th onclick="sort('이름')">이름</th> <th onclick="sort('μœ„μΉ˜')">μœ„μΉ˜</th> <th onclick="sort('가격')">가격</th> <th onclick="sort('방의개수')">방의개수</th> <th onclick="sort('μ˜ˆμ•½μžμˆ˜')">μ˜ˆμ•½μžμˆ˜</th> </tr> </thead> <tbody></tbody> </table>
var ν˜Έν…” = [{ '이름' : 'ν•˜λ‚˜ν˜Έν…”', 'μœ„μΉ˜' : 'μ œμ£Όλ„ μ œμ£Όμ‹œ 001', '가격' : {'A':50000, 'B':30000, 'C':15000}, '방의개수' : 50, 'μ˜ˆμ•½μžμˆ˜' : 25, 'λ‚¨μ€λ°©μ˜κ°œμˆ˜' : function(){return this.방의개수 - this.μ˜ˆμ•½μžμˆ˜} },{ '이름' : 'λ‘˜ν˜Έν…”', 'μœ„μΉ˜' : 'μ œμ£Όλ„ μ œμ£Όμ‹œ 002', '가격' : {'A':100000, 'B':60000, 'C':30000}, '방의개수' : 100, 'μ˜ˆμ•½μžμˆ˜' : 30, 'λ‚¨μ€λ°©μ˜κ°œμˆ˜' : function(){return this.방의개수 - this.μ˜ˆμ•½μžμˆ˜} },{ '이름' : 'μ…‹ν˜Έν…”', 'μœ„μΉ˜' : 'μ œμ£Όλ„ μ œμ£Όμ‹œ 003', '가격' : {'A':80000, 'B':50000, 'C':30000}, '방의개수' : 120, 'μ˜ˆμ•½μžμˆ˜' : 80, 'λ‚¨μ€λ°©μ˜κ°œμˆ˜' : function(){return this.방의개수 - this.μ˜ˆμ•½μžμˆ˜} }]; function sort(name){ let μ •λ ¬λœν˜Έν…” = ν˜Έν…”.sort((a, b) => (b[name] - a[name])); renderTable(μ •λ ¬λœν˜Έν…”); } function renderTable(ν˜Έν…”κΈ°λ³Έκ°’){ let tableBody = []; // JSON.stringify({ x: 5, y: 6 }) for (var variable of ν˜Έν…”κΈ°λ³Έκ°’) { tableBody.push(` <tr> <td>${variable.이름}</td> <td>${variable.μœ„μΉ˜}</td> <td>${JSON.stringify(variable.가격)}</td> <td>${variable.방의개수}</td> <td>${variable.μ˜ˆμ•½μžμˆ˜}</td> </tr> `); } document.querySelector('#rederingDataTable > tbody').innerHTML = tableBody.join(''); }
Β