본문 바로가기
기타/JSMN

JSMN simple.c 2 수정

by Jun_N 2018. 8. 8.

<Lab1. json text file로부터 읽기>
char *readjsonfile(const char * filename) 으로 변경 
동작 임의로 지정한 json 텍스트 파일로부터 json string을 만들어낸다
파라미터 : json text 파일이름 
리턴값 읽혀진 json string 
호출 예 : JSON_STRING = readjsonfile(“data.json”); 

  랩1은 저번 것과 다를 것이 없다. 다만 저번 코드 중에 내가 한 것 중 틀린 것이 있었다. 그것은 readjsonfile 함수에서 realloc의 2번째 파라미터에 strlen(temp)만 했던 것이다. realloc함수의 2번째 파라미터는 전체 길이를 정하는 것이기 때문에 strlen(str) 즉, 원래 사이즈만큼 더해주는 것이 맞다. 
그리고 이번에 읽을 파일은 data.json 이므로 읽을 파일명을 변경한다.


메인에서 파라미터로 파일명을 던져주면서, JSON_STRING에 반환시켜준다.

다음으로 새로 읽을 data.json 파일을 만든다.

새로 읽을 data.json 파일

이번 과제는 readjsonfile 함수가 외부 파일을 읽어들여서 JSON_STRING에 리턴을 해주느냐를 확인하는 것이기 때문에 실행시 이쁘게 나오지는 않지만 읽었다는 것을 알 수 있다.

<Lab2. json token 정보 출력>
void printall(const char *json, jsmntok_t *t, int tokcount) 
동작
파싱한 모든 토큰
(1~)의 구조체 정보를 출력한다
파라미터
json : 읽혀진 json string, t : 파싱 토큰배열, tokcount : 토큰갯수 
호출 예 : printall(JSON_STRING, t, r); 

랩2는 읽어들일 때 얻은 토큰들의 정보를 출력하는 과제다. 예전 디버그모드할 때가 생각나서 피피티6번을 참고헀다.

printall 함수의 모습


메인에서 콜

결과

이번 랩의 관건은  token의 이름과 타입을 넣어주는 것이었다. 하지만 전에 했던 동적할당의 개념을 적용해 str함수를 사용해서 했다.

<Lab3. json keys 출력>
void printkeys(const char *json, jsmntok_t *t, int tokcount) 
동작
파싱한 모든 토큰들 중에서 

키가 되는 토큰만 출력한다. (내용번호
파라미터
json : 읽혀진 json string, t : 파싱 토큰배열tokcount : 토큰갯수 
호출 예 : printkeys(JSON_STRING, t, r); 

랩3은 토큰들 중 key만 골라내는 과제이다. key가 있는지는 size 여부로 판단한다. 하다가 곤란 했던 것이 size가 있는 것들 중 '{' 와 '[' 를 빼내는 것이었다. 그 중에서도 중괄호는 인식이 안돼서 아스키 코드로 분류했다.

함수의 모습

메인에서 콜, 이번부터는 선택할 수 있도록 했다.

결과


<Lab4. json key token array 찾기>
Int findkeys(const char *json, jsmntok_t *t, int tokcount, int *keys) 
동작
파싱한 모든 토큰들 중에서 키가 되는 토큰만 찾아 토큰 번호를 정수배열에 저장한다

파라미터 - json : 읽혀진 json string, t : 파싱 토큰배열, tokcount : 토큰갯수 , keys : 저장할 토큰번호의 배열 포인터 
리턴값 저장된 키 토큰번호의 갯수 
배열선언 및 호출 예 : 
int keyarray[128], keyamount;
keyamount = findkeys(JSON_STRING, t, r, keyarray); 

랩4는 메인에서 정수배열 포인터를 보내 함수에서 토큰들의 인덱스를 담아오고 총 갯수가 몇갠지 받아오는 함수를 만드는 것이다. 

findkeys 함수

메인에서 호출

결과


<Mission : token별 해당 value 이쁘게 출력하기>
Lab 4를 통해 찾아낸 키 토큰의 번호를 참고하여 Json text 파일에 서의 키토큰별로 해당 값(value)을 이쁘게 출력하는 함수를 제작하라 
void printvalues(const char *json, jsmntok_t *t, int tokcount, int *keys); 
호출 예:
printvalues(JSON_STRING, t, r, keyarray);
 

  미션은 랩 4에서 만든 어레이를 바탕으로 키값들의 밸류들을 프린트하는 미션이다. 밸류들을 어떻게 꺼내는가가 관건이었는데 난 키값의 다음번째 토큰이 밸류라는 것을 생각하고 수행했다.

printvalues 함수
 - keyamount를 파라미터로 못넣는 것이 아쉬웠다. 그래서 어쩔 수 없이 findkeys를 한 번 더 콜했다.
 - 이전까지 free하는 것들을 까먹었는데 생각이 나서 free를 해줬다.

메인에서 콜

결과


'기타 > JSMN' 카테고리의 다른 글

JSMN simple.c 3탄  (0) 2018.08.08
JSMN simple.c 분석 및 응용  (0) 2018.08.08
JSMN , JSON malloc, realloc 사용해서 파일 읽기.  (0) 2018.08.08
JSON 개요  (0) 2018.06.22