목차
- 이전 포스팅의 C 언어 Json 자료구조 Context 생성 및 메모리 해제 예제 학습 링크
- 이전 포스팅의 C 언어 MariaDB Delete 쿼리 실행 및 결과 출력 예제 학습 링크
- 이전 포스팅의 C 언어 MariaDB Update 쿼리 예제 학습 링크
- C 언어 Json 자료구조 키, 값 추가 예제
- C 언어 Json Serialization 시리얼화 및 Json 문자열 출력 예제
이전 포스팅의 C 언어 Json 자료구조 Context 생성 및 메모리 해제 예제 학습 링크
이전 포스팅에서는 c언어에서 json 자료구조를 struct 자료구조로 구성한 후 context를 메모리 동적할당으로 생성하는 방법에 대해 알아보았습니다. 또한 메모리 동적 할당하지않고 스택에 구현도 가능합니다. json은 키와 값으로 이루어진 객체 자료구조를 의미합니다. 자바 혹은 파이썬에서는 이러한 json을 조금 더 쉽게 사용할 수 있으나 c언어에서는 json 자료구조 사용에 제약이 따릅니다. 이는 절차지향 언어의 특성을 가지고 있기 때문입니다. 만약 c언어에서 이러한 json 자료구조 사용방법이 궁금하시다면 아래 링크를 참고하여 학습해주세요.
2023.11.13 - [C] - [C 언어/C++] C 언어 포인터로 Json 자료구조 만들기 및 활용 예제 - 1(json context 생성 및 해제)
이전 포스팅의 C 언어 MariaDB Delete 쿼리 실행 및 결과 출력 예제 학습 링크
다음으로 이전 포스팅에서는 c언어에서 mariaDB를 사용하는 방법에 대해 알아보았습니다. 원격 서버에 설치된 mariaDB에 연결하여 로컬에서 Delete 삭제 쿼리문을 전송하여 실제 데이터베이스에 저장된 값을 삭제하는 예제에 대해 알아보았습니다. 이를 위해서는 MariaDB connector 라이브러리를 다운로드받아 사용해야합니다. 특히 c언어로 작성된 프로그램에서 이러한 외부 라이브러리를 사용하기 위해서는 라이브러리 링크가 필수적입니다. 만약 c언어에서 mariadb 연동 예제를 찾고 계시다면 아래 링크의 포스팅을 참고하여 학습해주세요.
2023.09.06 - [C] - [C/C++] MariaDB Delete 쿼리 실행 및 결과 출력 예제
이전 포스팅의 C 언어 MariaDB Update 쿼리 예제 학습 링크
마지막으로 이전 포스팅에서는 c언어에서 mariadb update 쿼리문을 실제 데이터베이스에 전달하여 쿼리를 실행시키는 방법과 예제에 대해알아보았습니다. udpate문은 이미 데이터베이스에 저장된 값을 다른 값으로 대체하는 것을 의미합니다. delete문은 기존에 있던 값을 삭제하는 예제라면 이와 반대되는 개념입니다. 또한 c프로그램에서 원격 서버에 있는 데이터베이스에 이러한 udpate 쿼리문을 전송함으로써 네트워크 통신 프로그램을 구현할 수 있습니다. 만약 c언어에서 mariadb 연동 기능이 필요하시다면 아래 링크를 참고하여 학습해주세요.
2023.09.06 - [C] - [C/C++] C언어 MariaDB Update 쿼리 실행 및 결과 출력 예제
C 언어 Json 자료구조 키, 값 추가 예제
아래는 c언어에서 json 자료구조를 생성하여 키와 값 쌍의 데이터를 저장하는 예제입니다. 한 쌍의 데이터만 추가하는 것이 아니라 계속해서 아이템 추가가 가능합니다. 자바와 파이썬에서 사용하는 json 자료구조와 동일합니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Json 자료구조를 나타내는 구조체
typedef struct {
char* key;
char* value;
} JsonEntry;
// Json context를 나타내는 구조체
typedef struct {
JsonEntry* entries;
size_t size;
} JsonContext;
// Json context를 초기화하는 함수
void initializeJsonContext(JsonContext* context, size_t initialSize) {
context->entries = (JsonEntry*)malloc(initialSize * sizeof(JsonEntry));
context->size = initialSize;
}
// Json context에 새로운 항목을 추가하는 함수
void addJsonEntry(JsonContext* context, const char* key, const char* value) {
// 필요 시 동적으로 메모리를 확장
if (context->size == 0) {
context->size = 1;
context->entries = (JsonEntry*)malloc(context->size * sizeof(JsonEntry));
} else {
context->size++;
context->entries = (JsonEntry*)realloc(context->entries, context->size * sizeof(JsonEntry));
}
// 새로운 항목 추가
context->entries[context->size - 1].key = strdup(key);
context->entries[context->size - 1].value = strdup(value);
}
// 예제 사용
int main() {
JsonContext myJsonContext;
initializeJsonContext(&myJsonContext, 0);
// 키와 값 추가
addJsonEntry(&myJsonContext, "name", "wonseok");
addJsonEntry(&myJsonContext, "age", "24");
addJsonEntry(&myJsonContext, "city", "seoul");
// 추가된 항목 출력
for (size_t i = 0; i < myJsonContext.size; ++i) {
printf("Key: %s, Value: %s\n", myJsonContext.entries[i].key, myJsonContext.entries[i].value);
}
return 0;
}
C 언어 Json Serialization 시리얼화 및 Json 문자열 출력 예제
아래는 c언어에서 키와 값들이 저장되어있는 json context 객체를 Serialization 시리얼화하여 json 문자열을 얻는 예제입니다. 이러한 json 문자열은 화면에 출력하거나 네트워크 통신을 통해 상대방에게 전송이 가능합니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Json 자료구조를 나타내는 구조체
typedef struct {
char* key;
char* value;
} JsonEntry;
// Json context를 나타내는 구조체
typedef struct {
JsonEntry* entries;
size_t size;
} JsonContext;
// Json context를 초기화하는 함수
void initializeJsonContext(JsonContext* context, size_t initialSize) {
context->entries = (JsonEntry*)malloc(initialSize * sizeof(JsonEntry));
context->size = initialSize;
}
// Json context에 새로운 항목을 추가하는 함수
void addJsonEntry(JsonContext* context, const char* key, const char* value) {
// 필요 시 동적으로 메모리를 확장
if (context->size == 0) {
context->size = 1;
context->entries = (JsonEntry*)malloc(context->size * sizeof(JsonEntry));
} else {
context->size++;
context->entries = (JsonEntry*)realloc(context->entries, context->size * sizeof(JsonEntry));
}
// 새로운 항목 추가
context->entries[context->size - 1].key = strdup(key);
context->entries[context->size - 1].value = strdup(value);
}
// Json context를 시리얼화하여 문자열로 반환하는 함수
char* serializeJsonContext(const JsonContext* context) {
size_t bufferSize = 0;
for (size_t i = 0; i < context->size; ++i) {
bufferSize += strlen(context->entries[i].key) + strlen(context->entries[i].value) + 6; // 6은 큰 그린 따옴표와 쉼표 등을 고려한 값
}
char* result = (char*)malloc(bufferSize + 3); // 3은 시작 중괄호, 끝 중괄호, 널 종료 문자를 고려한 값
strcpy(result, "{");
for (size_t i = 0; i < context->size; ++i) {
strcat(result, "\"");
strcat(result, context->entries[i].key);
strcat(result, "\":\"");
strcat(result, context->entries[i].value);
strcat(result, "\"");
if (i < context->size - 1) {
strcat(result, ",");
}
}
strcat(result, "}");
return result;
}
// 예제 사용
int main() {
JsonContext myJsonContext;
initializeJsonContext(&myJsonContext, 0);
// 키와 값 추가
addJsonEntry(&myJsonContext, "name", "wonseok");
addJsonEntry(&myJsonContext, "age", "24");
addJsonEntry(&myJsonContext, "city", "seoul");
// 시리얼화 및 출력
char* serializedJson = serializeJsonContext(&myJsonContext);
printf("Serialized Json: %s\n", serializedJson);
// 메모리 해제
free(serializedJson);
return 0;
}