UglyJSONParser : C++에서 타입-안전하게 JSON을 파싱하고 사용하게 해주는 오픈소스 크로스 플랫폼 라이브러리.
UglyJSONParser는
- C++용으로 개발된 오픈소스 JSON파서 라이브러리 입니다.
- 타입이 고정되어있어, 잘못된 타입으로 접근하는것을 거의 방지해줍니다.
- 사용이 간편합니다.
- 여러 플랫폼에서 사용 가능합니다.
- 상업/비상업적 이용 모두 무료입니다.
- 고정된 타입.
- 노드의 각 타입이 고정돼있고, 각 타입간의 변환이 불가능하도록 설계하여, 잘못된 타입으로 접근하는것을 거의 방지합니다.
- 단, Number타입의 int와 double은 변환이 가능합니다.
- 크로스 플랫폼 지원.
- CMake로 라이브러리를 각 환경에 맞게 빌드 할 수 있도록 하여, 보다 많은 플랫폼에서 사용 가능합니다.
- 사용이 간편합니다.
- 복잡하게 노드에 접근할 필요 없이, []와 .As타입() 으로 간단하게 노드와 데이터에 접근 가능합니다.
- 파일 입출력을 도와주는 클래스를 내장하여, 파일을 쉽게 읽고 쓸 수 있습니다.
- 노드를 구축하는것을 도와주는 클래스가 있어, 사용자는 오로지 데이터에 접근하는것에만 신경쓸 수 있습니다.
- 일부 이스케이프 문자 처리가 미흡하다.
- 현재 \\ , \" 만 지원하며, 그 이외의 이스케이프 문자는 '들어온 그대로 저장됩니다'
- 스레드 안전이 보장되지 않습니다.
- 멀티 스레드 환경에서, 하나의 json트리를 공유한다면, 예상치 못한 동작이 있을 수 있습니다.
- 고정된 타입.
- json 고유의 유동성을 저해할 수 있습니다.
버전 : v1.0
요구하는 최소 c++ 버전 : c++ 20
플랫폼 도구 집합 : Visual Studio 2022 (v143)
Windows SDK 버전 : 10.0
런타임 라이브러리 : Release => MD , Debug => MDd
최소 다시 빌드 기능 : Gm- 고정
종류 : Release 구성용 => UglyJSONParser.lib , Debug 구성용 => UglyJSONParser-d.lib
요구하는 최소 CMake 버전 : 3.20
펼치기/접기
-
소스코드와 build폴더, CMakeLists.txt가 있는 UglyJSONParser_v1.0_CMake.zip 파일을 원하는 폴더에 압축해제합니다.
-
명령어를 실행 가능한 프로그램(ex. powershell, shell, cmd ...)을 압축해제한 폴더 또는, 그냥 실행한 후, 해당 위치로 이동합니다.
-
압축 해제한 폴더의 build폴더로 이동합니다.
-
그 위치에서 cmake .. 명령어를 실행합니다.
- 이때, 자신이 사용할 툴체인,제너레이터, (사용하는 툴체인이나 제너레이터에 따라서 선택적으로)어떤 빌드 타입인지 등의 설정을 설정합니다.
-
명령어가 성공적으로 실행됐다면, 자신이 사용하는 툴체인이나 제너레이터에 맞는 빌드 명령어를 실행합니다.
- 빌드 단계에서 빌드 타입을 설정하는 툴체인이나 제너레이터의 경우는, 이 단계에서 빌드 타입을 설정합니다.
- 프로젝트(라이브러리)의 이름은 UglyJSONParser입니다.
-
결과물은 build/output 폴더에 저장됩니다.
-
저장된 결과물 이름을, 자신이 빌드한 타입에 따라 끝에 (-타입)의 형태로 타입을 명시해주는것이 권장됩니다.
-
결과물과 헤더파일들은, 자신이 원하는 경로로 이동해줍니다.
펼치기/접기
-
UglyJSONParser의 lib파일들과 헤더 파일이 모여있는 Include폴더의 UglyJSONParser 폴더를 다운로드, 또는 빌드하여 자신이 원하는 장소에 저장해둡니다.
아마 Releases 탭에서 편하게 두 파일을 다운로드 받을 수 있을겁니다. 이때, Include폴더와 lib들이 모여있는 폴더의 위치는 달라도 됩니다.
-
이 라이브러리를 사용할 프로젝트를 열고, 프로젝트 속성을 엽니다.
-
구성 속성 -> 링커 -> 일반탭의 추가 라이브러리 디렉터리 항목에 조금 전 lib이 있는 폴더의 위치를 복사 및 붙여넣기 합니다.
-
구성 속성 -> 링커 -> 입력탭의 추가 종속성 항목에 현제 솔루션의 구성에 알맞은 lib파일의 이름을 적어줍니다.
Release 구성이면 UglyJSONParser.lib을, Debug구성이면 UglyJSONParser-d.lib을 적어줍니다.
단, 이 부분은 사용자가 라이브러리의 이름을 다르게 설정했다면, 그 이름을 적어주면 됩니다.
-
구성 속성 -> VC++ 디렉터리의 외부 include 디렉터리에 헤더파일이 모여있는 폴더의 주소를 적어줍니다.
이 항목에서 적어주는 폴더의 주소는 #include <> 의 검색 시작 주소이다.
만약 C:\a\b에 헤더가 있고, 저 항목에 C:\a 를 적어주었다면, #include <b\헤더_이름.hpp> 의 형태로 사용 가능하다.
- 파일에서 읽어오고 저장하기.
json.json
{
"Hello": "World!",
"Int": 1234,
"float": 1.234000,
"exponent": 1000,
"array": [ 1, 2, 3, true, false ],
"object": { "key": "value" },
"null": null,
"nose": -3000
}
#include <UglyJSONParser/UglyJSONParserIncludeHeader.hpp>
#include <iostream>
int main()
{
//필요한 변수들 선언
UglyJSONParser::JSONParser parser;
UglyJSONParser::RootNode root;
//json파일에서 파일을 읽어와 root노드에 JSONTree 생성
parser.BuildJSONTreeFromFile(".\\testing\\json.json", root);
//JSONTree에서 값을 읽어오기
std::cout << "Hello : " << root["Hello"].AsString() << '\n';
std::cout << "Int : " << root["Int"].AsInt() << '\n';
std::cout << "float AsDouble : " << root["float"].AsDouble() << '\n';
std::cout << "float AsInt : " << root["float"].AsInt() << '\n';
std::cout << "Array 0 : " << root["array"][0].AsInt() << '\n';
std::cout << "Array 3 : " << root["array"][3].AsBool() << '\n';
std::cout << "Array 4 : " << root["array"][4].AsBool() << '\n';
std::cout << "Object Key : " << root["object"]["key"].AsString() << '\n';
std::cout << "nose : " << root["nose"].AsInt() << '\n';
//값 수정
std::cout << "before : Hello : " << root["Hello"].AsString() << '\n';
root["Hello"] = "and O'men";
std::cout << "after : Hello : " << root["Hello"].AsString() << '\n';
//파일에 JSONTree의 값 저장
parser.SaveJSONTreeToFile(".\\testing\\json.json", root);
return 0;
}
- string에서 읽어오기
#include <UglyJSONParser/UglyJSONParserIncludeHeader.hpp>
#include <iostream>
int main()
{
//필요한 변수들 선언
UglyJSONParser::JSONParser parser;
UglyJSONParser::RootNode root;
std::string json = "{\"key\":\"value and this is \\\"value\\\"\", \"arr\" : [1,1e+4,1.234]}";
//string을 기반으로 JSONTree 생성
parser.BuildJSONTreeFromString(json, root);
//값 읽어오기
std::cout << "key : " << root["key"].AsString() << '\n';
std::cout << "arr 0 : " << root["arr"][0].AsInt() << '\n';
std::cout << "arr 1 : " << root["arr"][1].AsInt() << '\n';
std::cout << "arr 2 : " << root["arr"][2].AsDouble() << '\n';
return 0;
}
UglyJSONParser v1.0 API Documents
주의 : 이 문단은 제작자가 발견하지 못한 이슈에 대한 해결법은 작성되어있지 않습니다. 만약 새로운 이슈를 발견한다면 제작자에게 연락하거나, 해당 리포지토리에 new issue를 해준다면, 가능한 한 빠른 시일 내로 업데이트 될것입니다.
Q: LNK 2038오류가 발생합니다. A: 다음을 확인해보십시오:
- 솔루션의 구성 : Debug 구성에서 Release 구성용 .lib을 사용했습니까?
- 런타임 라이브러리가 일치합니까?
(아직 준비되지 않았습니다.)
제작자: nuke1115
연락처:
Discord : yellowsticker_ / 노란딱지#7701