c++ nlohmann::json 是当前排名第一人库,但是在解析中文时会有问题
- std::string to_utf8(std::wstring& wide_string)
- {
- static std::wstring_convert
wchar_t>> utf8_conv; - return utf8_conv.to_bytes(wide_string);
- }
-
- void test_nlohmann() {
- using namespace nlohmann;
- nlohmann::json j;
-
- // 测试中文和英文提前解析
- std::string js1 = R"({"key": "中文"})";
- std::string js2 = R"(Not a json string)";
-
- std::wstring js3 = LR"({"name":"中文"})";
- std::wstring js4 = LR"("中文"})";
-
- bool jsonStringIsValid = json::accept(js1);
- bool notJsonStringIsValid = json::accept(js2);
-
- jsonStringIsValid = json::accept(js3);
- notJsonStringIsValid = json::accept(js4);
-
- nlohmann::json jt;
- jt["age"] = 1;
- jt["name"] = "张三";
-
- auto jt_out = jt.dump();
- auto dd = utf8_to_ascii(jt["name"].get
()); -
- // 要先转成宽字符
- std::wstring str_json = LR"({"age":"12","name":"中文"})";
-
- try {
- j = nlohmann::json::parse(str_json);
-
- auto str_out = j.dump();
- if (j.contains("name") && j["name"].is_string()) {
- std::string value = utf8_to_ascii(j["name"].get
()); - int c = 0;
- }
- }
- catch (nlohmann::json::parse_error& ex) {
- std::string what = ex.what();
- }
-
- // 生成带中文的测试
- json j2;
- std::wstring ws = L"中文";
-
- j2["id"] = 123;
- j2["encoded"] = CW2A(ws.c_str(), CP_UTF8);
-
- std::string out = j2.dump();
-
- int c = 0;
- }
这样测试成功。