스크립트에서 테이블 생성하여 JSON value값 넣기

 

json 예시

[
	{
		"title":"완전한 행복",
		"author":"정유정",
		"price":"14,200원"	
	},
	{
		"title":"혼자의 넓이",
		"author":"이문재",
		"price":"8,100원"	
	},
	{
		"title":"인간만세",
		"author":"오한기",
		"price":"11,700원"	
	},
	{
		"title":"빅버드",
		"author":"박기영",
		"price":"13,050원"	
	},
	{
		"title":"재와 물거품",
		"author":"김청귤",
		"price":"9,000원"	
	}
]

 

html 예시

<h2>책 목록표 JSON 받아오기</h2>
<table id="table" border="1" style="width: 25%"  cellpadding="5" rules="rows">
<tr>
	<th>제목</th><th>저자</th><th>가격</th>
</tr>
</table>

<script type="text/javascript">

let xhttp = new XMLHttpRequest();

xhttp.onreadystatechange = function () {

	if(xhttp.readyState == 4 && xhttp.status == 200){
		jsonfunc(this.responseText); 
	}
}
xhttp.open("GET","book.json", true);
xhttp.send();

function jsonfunc( jsonText ) {
	let arrTitle = new Array();
	let arrAuthor = new Array();
	let arrPrice = new Array();
	
	let json = JSON.parse(jsonText);

	for(i=0; i<json.length; i++){ // 값 전체 가져오는법
		arrTitle[i] = json[i].title;
		arrAuthor[i] = json[i].author;
		arrPrice[i] = json[i].price;
	}
	let table = document.getElementById('table');

	for(i=0; i<arrTitle.length; i++){
		let tr = document.createElement("tr");
		
		let td1 = document.createElement("td");			  
		td1.appendChild(document.createTextNode(arrTitle[i] + ""));
		
		let td2 = document.createElement("td");			 
		td2.appendChild(document.createTextNode(arrAuthor[i] + ""));
		
		let td3 = document.createElement("td");			 
		td3.appendChild(document.createTextNode(arrPrice[i]+ ""));
		
		tr.appendChild(td1);
		tr.appendChild(td2);
		tr.appendChild(td3);
		
		table.appendChild(tr);
	}
}
</script>

 

설명

new Array() : 테이블을 만들기 전 테이블에 뿌려줄 json value값을 넣기 위해 배열을 생성한다.

let json = JSON.parse(jsonText) : 변수를 지정하여 json 데이터를 파싱해준다.

for문을 사용하여 key값으로 접근 → 변수에 value값을 넣어준다.

for문을 사용하여 td태그에 값을 넣어주고 appendChild를 사용하여 데이터를 추가한다.

 

실행화면


XML 예시 : json데이터와 동일하다.

<?xml version="1.0" encoding="UTF-8"?>
<books>
	<book>
		<title>완전한 행복</title>
		<author>정유정</author>
		<price>14,200원</price>
	</book>
	<book>
		<title>혼자의 넓이</title>
		<author>이문재</author>
		<price>8,100원</price>
	</book>
	<book>
		<title>인간만세</title>
		<author>오한기</author>
		<price>11,700원</price>
	</book>
	<book>
		<title>빅버드</title>
		<author>박기영</author>
		<price>13,050원</price>
	</book>
	<book>
		<title>재와 물거품</title>
		<author>김청귤</author>
		<price>9,000원</price>
	</book>
</books>

 

html 예시 : 위 예제와 동일 구문이 많아 데이터 넣는 코드만 업로드 하였다.

// 위코드 json예제와 동일
xhttp.send();

function nodeValfunc( xml ) { // ( xml ) 객체 넘겨받기
	let arrTitle = new Array();
	let arrAuthor = new Array();
	let arrPrice = new Array();
	
	let title, author, price;
	let xmlDoc;

	xmlDoc = xml.responseXML; 
	
	title = xmlDoc.getElementsByTagName("title");
	author = xmlDoc.getElementsByTagName("author");
	price = xmlDoc.getElementsByTagName("price");

	for(i=0; i < title.length; i++){
		arrTitle[i] = title[i].childNodes[0].nodeValue;
		arrAuthor[i] = author[i].childNodes[0].nodeValue;
		arrPrice[i] = price[i].childNodes[0].nodeValue;
	}
    
    let table = document.getElementById('table');
// 아래코드 json예제와 동일

 

설명

new Array() : 테이블을 만들기 전 테이블에 뿌려줄 XML 데이터를 넣기 위해 배열을 생성한다.

xml.responseXML : xml문서의 데이터를 변수에 넣어줍니다.

title = xmlDoc.getElementsByTagName("title") : xmlDoc의 tag name명이 "title"인 요소의 node list를 넘겨받아 title에 넣어줍니다.

for문을 사용 → 배열에 childNodes[0].nodeValue로 접근하여 값을 넣어준다. 

 

실행화면은 json과 동일합니다.

html에서 json 데이터 불러오기

 

아래와 같은 json파일이 있다고 가정하자.

[
   {
      "name":"정수동",
      "age":24,
      "address":"서울시",
      "height":181.1
   },
   {
      "name":"심청",
      "age":14,
      "address":"강원시",
      "height":155.4
   },
   {
      "name":"향단",
      "age":17,
      "address":"남원시",
      "height":159.2
   },
   {
      "name":"이몽룡",
      "age":18,
      "address":"공주시",
      "height":173.3
   }
]

 

예시 1

<p id="demo"></p>

<script type="text/javascript">

let xhttp = new XMLHttpRequest();

xhttp.onreadystatechange = function () {
	if(xhttp.readyState == 4 && xhttp.status == 200){
		jsonfunc(this.responseText); //this = xhttp
//		jsonfunc(xhttp.responseText); // 둘다 가능
	}
}
xhttp.open("GET","member.json", true);
xhttp.send();

function jsonfunc( jsonText ) {

	let json = JSON.parse(jsonText); // String -> json으로 변환
	
	let txt = "";
	// 접근법 1
	for(i=0; i<json.length; i++){
		for(key in json[i]){ // key값 가져오기
			txt += key + ":" + json[i][key]; 
		}
		txt += "<br>";
	} 
	document.getElementById('demo').innerHTML = txt;
}
</script>

 

설명

json도 데이터를 읽어오려면 XML을 사용한다.

이중 for문을 사용하여 key값과 value값을 가져온다.

 

 

예시 2

	// 접근법 2
	for(i=0; i<json.length; i++){
		txt += json[i].name + " " + json[i].age + " " +
			   json[i].address+ " " + json[i].height + "<br>";
	}

 

설명

for문의 사용법만 달라진다.  key에 바로 접근하여 value값을 가져온다.

보기에 더 명확한 코드라 더 많이 사용하는 형식이다.

 

실행화면

정수동 24 서울시 181.1
심청 14 강원시 155.4
향단 17 남원시 159.2
이몽룡 18 공주시 173.3

예시 3

<p id="demo1"></p>
<p id="demo2"></p>
<p id="demo3"></p>
<p id="demo4"></p>
<script type="text/javascript">
let json = { // json : 맨앞에 [], {} 된다.
	       "quiz": {
	           "sport": {
	               "q1": {
	                   "question": "Which one is correct team name in NBA?",
	                   "options": [
	                       "New York Bulls",
	                       "Los Angeles Kings",
	                       "Golden State Warriros",
	                       "Huston Rocket"
	                   ],
	                   "answer": "Huston Rocket"
	               }
	           },
	           "maths": {
	               "q1": {
	                   "question": "5 + 7 = ?",
	                   "options": [
	                       "10",
	                       "11",
	                       "12",
	                       "13"
	                   ],
	                   "answer": "12"
	               },
	               "q2": {
	                   "question": "12 - 8 = ?",
	                   "options": [
	                       "1",
	                       "2",
	                       "3",
	                       "4"
	                   ],
	                   "answer": "4"
	               }
	           }
	       }
	   };
document.getElementById("demo1").innerHTML = json.quiz.sport.q1.question[0];
document.getElementById("demo2").innerHTML = json.quiz["sport"].q1.question;
document.getElementById("demo3").innerHTML = json.quiz.sport.q1.options[1];
document.getElementById("demo4").innerHTML = json.quiz.maths.q1.options[2];
</script>

설명

배열로 접근하는 방식이다.

key값.key값.key값.key값 이런식으로 접근한다. value의 index가 1개일 땐 [0]을 사용하지 않는다.

[0]을 사용할 경우 해당 index의 첫번째 문자열만 반환한다.

 

실행화면

W

Which one is correct team name in NBA?

Los Angeles Kings

12

 

JSON(Java Script Object Notation)

key : value - key값을 통해서 value값을 얻는다.

json은 문자열이 아니다. 완전한 json데이터이다.

블록으로 관리한다.

xml에 비해 접근법이 간단하다.

key값은 영어를 권장한다.

JSON파일의 시작 괄호는 [, { 둘다 사용 가능하다.

 

JSON파일 예시 

[
    {
    name:"홍길동",
    age:24,
    address:"서울시"
    },
    {
    name:"성춘향",
    age:16,
    address:"남원시"
    }
]

 

html 접근 예시

 <p id="demo1"></p>
 <p id="demo2"></p>

 <script type="text/javascript">
 let jsonData = [	// json의 형태
					 { // 0번지
						 name:"홍길동",
					   	 age:24 
					 },
					 { // 1번지
						 name:"성춘향",
					   	 age:24 
					 },
					 { // 2번지
						 name:"일지매",
					   	 age:24 
					 }
				 ];
 // alert(jsonData);

 document.getElementById("demo1").innerHTML 
 			= jsonData[0].name + " " + jsonData[0].age;
 
 let jsonText = '{ "name":"홍두깨", "age":25, "주소":"서울시" }';  // 현재는 문자열이다.
 // alert(jsonText);
 
 let jsonObj = JSON.parse(jsonText);
 let jsonStr = JSON.stringify(jsonObj)
 
 document.getElementById("demo2").innerHTML =  jsonObj.name + " " + jsonObj.주소;

 </script> 

 

설명

json value 접근방법 : json변수명[index].key로 접근할 수 있다.

alert(jsonData) : 문자열이면 문자열 전체가 보일텐데 jsonData이기 때문에 object가 출력된다.

alert(jsonText) : 문자열이기 때문에 문자열 전체가 출력된다.

JSON.parse(jsonText)  : String → json(object) 변경법

JSON.stringify(jsonObj) : json(object) → String 변경법

json을 String형으로 변경시 key값은 ""따옴표 안에 들어가 있어야 한다. 예시) "name"

 

실행화면

홍길동 24

홍두깨 서울시
Insert title here

배열의 연산

첨자aba x b
0533
11214
21865

 

예제

<h3>배열의 연산</h3>
<table>
<col width="50"><col width="80"><col width="80"><col width="100">
<thead>
	<tr>
		<th>첨자</th><th>a</th><th>b</th><th>a x b</th>
	</tr>
</thead>
<tbody>
	<tr>
		<th>0</th><td>5</td><td>33</td>
		<td>
			<button type="button" onclick="multi(0)">계산결과</button>
	</tr>
	<tr>
		<th>1</th><td>12</td><td>14</td>
		<td>
			<button type="button" onclick="multi(1)">계산결과</button>
	</tr>
	<tr>
		<th>2</th><td>18</td><td>65</td>
		<td>
			<button type="button" onclick="multi(2)">계산결과</button>
	</tr>
</tbody>
</table>
<script type="text/javascript">

let nodeNum = document.getElementsByTagName("td");

let a = new Array(3); // index 0, 3, 6이 필요
let b = new Array(3); // index 1, 4, 7이 필요

for(i=0; a.length; i++){
	a[i] = nodeNum[0 + (3*i)].innerHTML;
	b[i] = nodeNum[1 + (3*i)].innerHTML;
}
function multi(index) {
	let result = a[index] * b[index];
	alert("계산결과는"+result+"입니다");
}
</script>

 

설명

 버튼 클릭시 계산결과가 나온다.

 table의 값과 관계없이 index번호로 접근하여 계산하는 예제이다.

 

let nodeNum = document.getElementsByTagName("td");

getElementsByTagName("태그명") : 해당 태그들의 인덱스 번호를 가져온다. 

위 코드의 td태그는 9개, nodeNum의 값은 8이 된다. (index 0부터 시작)

연산할 index값을 for문을 통해 배열에 넣어준다.

 

Insert title here

환영합니다

※현재 시각은 입니다.

 

예제

<h1>환영합니다</h1>
※현재 시각은
<input type="text" id="date">입니다.
<script type="text/javascript">
function dates() {
	let dates = new Date();
	document.getElementById("date").value = dates.getHours()+":"+
							   	dates.getMinutes()+":"+
							   	dates.getSeconds();
}
setInterval("dates()", 1000);
</script>

 

설명

 text value값으로 현재 시간을 넣어주는 간단한 예제이다.

 다만, 이방식으로 할 경우 1~9의 시,분,초 앞에 0이 나오질 않는다.

 setInterval()함수를 통해 1초마다 시간이 갱신된다.

 

 

시,분,초가 1~9일 때 앞에 0이 붙도록 하는 예제

<h1>환영합니다</h1>
※현재 시각은
<input type="text" size="5" id="timebox">입니다.
<script type="text/javascript">
function nowtime() {
	let now = new Date();
	
	let hour = now.getHours();
	let minute = now.getMinutes();
	let second = now.getSeconds();
	
	if(hour < 10){
		hour = "0"+ hour;
	}else if(minute < 10){
		minute = "0"+ minute;
	}else if(second < 10){
		second = "0"+ second;
	}
	document.getElementById("timebox").value = hour+":"+minute+":"+second;
}
setInterval("nowtime()", 1000);
</script>

 

설명

조건문을 사용하여 시,분,초가 1~9일 때 앞에 0이 붙도록 하였다.

 

Insert title here

2개의 주사위

버튼을 클릭하면 2개의 주사위가 랜덤됩니다.



 

예제

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>2개의 주사위</h1>
버튼을 클릭하면 2개의 주사위가 랜덤됩니다.<br><br>
<img alt="" src="./images/sai_1.gif" id="d1">
<img alt="" src="./images/sai_6.gif" id="d2"><br><br>
<p id="dic1">합계</p><br>

<script type="text/javascript">
function dice() {
	// ceil : 올림
	let r1 = Math.ceil(Math.random()*6);
	let r2 = Math.ceil(Math.random()*6);
	
//	document.getElementById("d1").src="./images/sai_"+r1+".gif";
//	document.getElementById("d2").src="./images/sai_"+r2+".gif";
	// 이런식으로도 접근 가능
	document.images[0].src = "./images/sai_"+r1+".gif";
	document.images[1].src = "./images/sai_"+r2+".gif";
}
</script>
</body>
</html>

 

해석

 이 코드는 주사위 이미지명의 끝번호가 1~6일 경우 유효한 예제이다.

 Math.random()*6을 올림처리하여 1~6까지 랜덤의 수를 구하고,

 img태그의 id값이나 images의 요소번호로 img태그에 접근하여 이미지 주소값의 마지막 번호롤 바꿔준다.

 

 

이미지 주소값이 일정하지 않을 경우 예제

</script>
<h2>4번문제</h2>
<h1>2개의 주사위</h1>
버튼을 클릭하면 2개의 주사위가 랜덤됩니다.<br><br>
<img alt="" id="random1" src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvLgiT%2Fbtq6LVk7fAX%2FkJ2Ktj0dkd7VkOmrxnLFkK%2Fimg.gif">
<img alt="" id="random2" src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvLgiT%2Fbtq6LVk7fAX%2FkJ2Ktj0dkd7VkOmrxnLFkK%2Fimg.gif"><br><br>
<button type="button" onclick="radom()">주사위를 굴린다</button>
<script type="text/javascript">
function radom() {
	let randomNum1 = Math.round(Math.random()*6);
	let randomNum2 = Math.round(Math.random()*6);
	if(randomNum1 == 1){
		document.getElementById("random1").src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvLgiT%2Fbtq6LVk7fAX%2FkJ2Ktj0dkd7VkOmrxnLFkK%2Fimg.gif"
	}else if(randomNum1 == 2){
		document.getElementById("random1").src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhnQZy%2Fbtq6LW5qS62%2FAOJu3uPFLeaVVkjAkZVUs1%2Fimg.gif"
	}else if(randomNum1 == 3){
		document.getElementById("random1").src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYRuiD%2Fbtq6HQd0tDp%2Fhs6OP3kdsLqWKV5bHWZzbK%2Fimg.gif"
	}else if(randomNum1 == 4){
		document.getElementById("random1").src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG8rVr%2Fbtq6JxZz1hP%2F3WhKeYaAKkL6S11B3LPfuk%2Fimg.gif"
	}else if(randomNum1 == 5){
		document.getElementById("random1").src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEMxkY%2Fbtq6Gp8KkpC%2FFKtnqwR5HBXMkGjzxgclfK%2Fimg.gif"
	}else if(randomNum1 == 6){
		document.getElementById("random1").src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNdGpW%2Fbtq6DRYA7iQ%2FPxZBpN1flIbnRi17XxtiF1%2Fimg.gif"
	}
	if(randomNum2 ==1){
		document.getElementById("random2").src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvLgiT%2Fbtq6LVk7fAX%2FkJ2Ktj0dkd7VkOmrxnLFkK%2Fimg.gif"
	}else if(randomNum2 == 2){
		document.getElementById("random2").src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhnQZy%2Fbtq6LW5qS62%2FAOJu3uPFLeaVVkjAkZVUs1%2Fimg.gif"
	}else if(randomNum2 == 3){
		document.getElementById("random2").src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYRuiD%2Fbtq6HQd0tDp%2Fhs6OP3kdsLqWKV5bHWZzbK%2Fimg.gif"
	}else if(randomNum2 == 4){
		document.getElementById("random2").src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG8rVr%2Fbtq6JxZz1hP%2F3WhKeYaAKkL6S11B3LPfuk%2Fimg.gif"
	}else if(randomNum2 == 5){
		document.getElementById("random2").src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEMxkY%2Fbtq6Gp8KkpC%2FFKtnqwR5HBXMkGjzxgclfK%2Fimg.gif"
	}else if(randomNum2 == 6){
		document.getElementById("random2").src="https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNdGpW%2Fbtq6DRYA7iQ%2FPxZBpN1flIbnRi17XxtiF1%2Fimg.gif"
	}
}

 

+ Recent posts