본문 바로가기
기타/JSMN

JSMN simple.c 3탄

by Jun_N 2018. 8. 8.

<Lab1 : my menu.json 만들기>
인터넷 등에서 마음에 드는 음식점의 메뉴판을 고를 것.
앞 페이지의 구조체타입 선언부를 참고하여 4종류 이상의 값을 뽑아내서 메 
뉴 정보를 만들 것.
메뉴카테고리메뉴이름주문기준가격 
해당 정보들을 토대로 json 텍스트 파일을 만들것 파일명 : mymenu.json 
주의사항
하나의 키에 여러 
value가 들어가는 경우 JSMN_ARRAY 사용해야 함 
([ .. ] 괄호 사용)

중식메뉴와 피자메뉴로 결정, json 형식으로 만든다.


<Lab2 : mymenu.json>
parsejsonfile.c —> mystore.c로 복사한 후 기능을 구현할 것 Makefile 수정하여 target으로 mystore 추가할 것
char *readjsonfile(const char * filename) 을 사용하여 mymenu.json 읽으면서 파싱 
호출 예 :
JSON_STRING = readjsonfile(“mymenu.json”); 
파싱하기

mystore.c 만들기

Makefile 수정

readjsonfile 

JSON_STRING을 readjsonfile로 받아오기(경로 입력)

결과, 작아서 잘 안보이긴 하지만 위에서 본 mymenu.json이 다 읽히고 JSON_STRING으로 들어갔다.


<Lab3 : 파싱된 토큰으로 mymenu 구조체 완성>
파싱한 토큰배열과 JSON 문자열을 가지고, mymenu 배열에 구조체를 채워 넣는다.
int makemymenu(const char *json, jsmntok_t *t, int tokcount, mymenu_t * m[]) 
동작
파싱한 모든 토큰에서 메뉴정보를 맞춰 메뉴구조체를 만들어 구조체포인터배열에 할당한다

파라미터
json : 읽혀진 json string, t : 파싱 토큰배열
tokcount : 토큰갯수, m : 메뉴정보를 담을 구조체포인터배열 
리턴 값 채운 메뉴정보(구조체)의 갯수 
호출 예 :
menucount = makemymenu(JSON_STRING, t, r, mymenu);

먼저  mymenu_t 구조체를 정의해두자! 그리고 mycategory_t는 enum으로 정의한다.

makemymenu 함수를 만드는데 결국 m구조체 포인터 배열에 포인터의 성질을 이용해 메뉴의 내용을 채워넣고 메뉴의 갯수를 반환하는 함수다. 

중요한 것은 메인에서 mymenu_t 구조체의 포인터 배열 mymenu[20] 을 선언해줘야 함수의 인자로 넘겨주고 그 값을 저장할 수 있는 것이다.
그 다음 메인의 말미에 makemymenu 함수를 사용한다.

*추가 
t[].parent를 쓰려면 Makefile에서 사진과 같이 c파일을 o파일로 컴파일할 때 매크로를 넣어줘야 한다.
jsmn.c와 jsmn.h를 보면 parent를 쓰기위해선 JSMN_PARENT_LINKS가 선언돼야하기 때문.



결과로 8개의 메뉴를 읽었으므로 8이 나온다.

<Lab4 : 메뉴정보 출력하기> 
만들어진 메뉴구조체포인터 배열의 모든 메뉴를 출력한다. void printmenu(mymenu_t *m[], int mcount); 
동작
메뉴구조체 포인터 배열의 갯수만큼 화면에 메뉴정보를 출력한다
출력 예각 줄마다 카테고리메뉴이름사이즈가격 
파라미터 - m : 메뉴정보를 담고 있는 구조체포인터배열mcount : 저장된 구조체의 갯수 
호출 예 :
printmenu(mymenu, menucount); 


배열의 갯수도 인자로 오고, 배열도 완성돼 있으므로 어렵지 않다.
주의할 것은 포인터이므로 '.'이 아닌 '->'를 쓴다는 것과 category를 if문으로 정해준다는 것이다.
printmenu 함수의 모습

메인에서 호출하는 모습

결과


<추가 과제>
1일 매출계산 기능 구현 (세부적인 부분은 임의로 결정해서 제작할 것
하루 동안의 주문서 갯수만큼 반복문을 통해 메뉴번호와 주문갯수들을 입력받아 총 판매금액 및 메뉴별 판매금액합계를 계산하여 출력함


내가만들 함수는 void salesMode(mymenu_t * m[], int mcout) 이고
호출은 salesMode(mymenu, menucount) 로 한다.
함수를 호출하면 메뉴판을 보여주고 반복으로 주문할 음식의 번호를 받는다.
1~8이 아닌 수를 받으면 종료하고 토탈값을 출력해준다.

salesMode 함수의 모습

메인에서 호출, 0번이다.

결과


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

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