Skip to content

JsonParser

jsoncpp

C++
#include "json/json.h"
/* config.json
{
    "test1": {
        "inputFile": "/data/1080p.h264",
        "outputFile": "/data/decoded_1080p.yuv",
        "width": 1920,
        "height": 1080,
        "pixelFormat": 2,
        "enableSurface": true,
        "writeFile": false,
        "parallelCount": 1,
        "runCount": 1
    },
    "test2": {
        "inputFile": "/data/1080p.yuv",
        "outputFile": "/data/encoded_1080p.h264",
        "width": 1920,
        "height": 1080,
        "pixelFormat": 2,
        "enableSurface": true,
        "writeFile": false,
        "parallelCount": 1,
        "runCount": 1
    }
}
*/
struct TestConfig {
    std::string inputFile;
    std::string outputFile;
    int         width         = 0;
    int         height        = 0;
    int         pixelFormat   = 2;
    bool        enableSurface = false;
    bool        writeFile     = true;
    int         parallelCount = 0;
    int         runCount      = 0;
};
static void ParseConfig(TestConfig& testConfig, const char* path, int mode)
{
    std::ifstream ifs(path);
    std::string   info;
    std::string   line;
    while (ifs >> line) {
        info += line;
    }
    // cout << "json: " << info << endl;
    JSONCPP_STRING                          errs;
    Json::CharReaderBuilder                 readerBuilder;
    Json::Value                             root;
    std::unique_ptr<Json::CharReader> const jsonReader(readerBuilder.newCharReader());
    bool res = jsonReader->parse(info.c_str(), info.c_str() + info.length(), &root, &errs);
    if (!res || !errs.empty()) {
        std::cerr << "parse failed\n" << errs << "\n";
    }
    auto config              = root[("test" + std::to_string(mode)).c_str()];
    testConfig.inputFile     = config["inputFile"].asString();
    testConfig.outputFile    = config["outputFile"].asString();
    testConfig.width         = config["width"].asInt();
    testConfig.height        = config["height"].asInt();
    testConfig.pixelFormat   = config["pixelFormat"].asInt();
    testConfig.enableSurface = config["enableSurface"].asBool();
    testConfig.writeFile     = config["writeFile"].asBool();
    testConfig.parallelCount = config["parallelCount"].asInt();
    testConfig.runCount      = config["runCount"].asInt();
}

getline

C++
#include <iostream>
#include <sstream>
static bool SplitKeyValue(const char* buffer, std::string& key, std::string& value)
{
    if (buffer[0] == '#') {
        return false;
    }
    std::stringstream strStream(buffer);
    // use delim
    std::getline(strStream, key, '=');
    std::getline(strStream, value, '=');
    if (value[value.length() - 1] == '\r') {
        value = value.substr(0, value.length() - 1);
    }
    if (value[value.length() - 1] == '\n') {
        value = value.substr(0, value.length() - 1);
    }
    return true;
}