iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0
Software Development

C++ 實務基礎經驗系列 第 5

第三方套件 jsoncpp, ajson

  • 分享至 

  • xImage
  •  

第三方套件 jsoncpp, ajson

今天來介紹C++中用於解析跟序列化Json格式資料的兩個套件。

環境

環境就延續Day4的Dockerfile,重啟一個新的Container來做Demo。

docker run -v D:/dvt:/home --name=cpp_dev --tty cpp_dev

jsoncpp

首先介紹jsoncpp,是一個能夠解析Json文件的函式庫,甚至能解析文件中的註解。

安裝 jsoncpp

安裝的部分,一樣是靠vcpkg來搞定。

vcpkg install jsoncpp

成功的話,應該會看到以下信息。

jsoncpp provides CMake targets:

    # this is heuristically generated, and may not be correct
    find_package(jsoncpp CONFIG REQUIRED)
    target_link_libraries(main PRIVATE JsonCpp::JsonCpp)

然後再透過CMakeCLI設定專案,如果不想用CLI,也可以參考Day2中提到,在VS Code的settings.json加入相對應的欄位設定。

cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=/opt/vcpkg/scripts/buildsystems/vcpkg.cmake

使用 jsoncpp

這邊就拿官方的example展示。

#include "json/json.h"
#include <fstream>
#include <iostream>
 
int main(int argc, char* argv[]) {
  Json::Value root;
  std::ifstream ifs;
  ifs.open(argv[1]);

  Json::CharReaderBuilder builder;
  builder["collectComments"] = true;
  JSONCPP_STRING errs;
  if (!parseFromStream(builder, ifs, &root, &errs)) {
    std::cout << errs << std::endl;
    return EXIT_FAILURE;
  }
  std::cout << root << std::endl;
  return EXIT_SUCCESS;
}

json file:

// comment head
{
    // comment before
    "key" : "value"
    // comment after
}// comment tail
cd build/
make
./jsoncpp_demo ../demo.json
# output
// comment head
{
        // comment before
        "key" : "value"
} // comment tail
// comment after

ajson

ajson也是一個能夠解析json格式的函式庫,但他更特別的地方在於他能將json物件轉成C++中的結構體(struct)。

安裝 ajson

ajson安裝的話,就不能透過vcpkg了,因為vcpkg中目前並沒有包含ajson,但ajson其實只需要有頭文件就可以使用,所以我們只需要從github抓下來即可使用。

git clone https://github.com/lordoffox/ajson.git

使用 ajson

這邊也是一樣使用官方的example。

#include <iostream>
#include <string>

#include "ajson.hpp"

using namespace std;
using namespace ajson;

struct demo
{
  string hello;
  string world;
};

AJSON(demo,hello,world)

int main(int argc, char * argv[])
{
 char * buff = "{\"hello\" : \"Hello\", \"world\" : \"world.\"}";
 demo the_demo;
 load_from_buff(the_demo,buff);
 cout << the_demo.hello << " " << the_demo.world << std::endl;
 cin.get();
 return 0;
}
cd build/
make
./ajson_demo
# output
Hello world.

End

以上代碼都同步到我的github上,有需要都可以自己抓下來試試。


上一篇
第三方套件 Google Benchmark
下一篇
第三方套件 faltbuffers
系列文
C++ 實務基礎經驗25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言