- Poco JSON
- 生成

/////////////////// POCO::JSON ///////////////////// #include "Poco/JSON//Parser.h" #include "Poco/Dynamic/Var.h" #include <fstream> void CreateJson() { Poco::JSON::Object root, temp; Poco::JSON::Array province, cities; // 1. //对中文的支持不好 cities.add("大庆"); cities.add("哈尔滨"); temp.set("name", "黑龙江"); temp.set("cities", cities); province.add(temp); cities.clear(); temp.clear(); cities.add("深圳"); cities.add("广州"); temp.set("name", "广东"); temp.set("cities", cities); province.add(temp); root.set("province", province); root.set("country", "中国"); std::ostringstream osstr; root.stringify(osstr, 2);//中文显示不出 std::string s = osstr.str(); /* 结果: { "country" : "中国", "province" : [ { "cities" : [ "u00B4u00F3u00C7u00EC", "u00B9u0FB6u0EF1u00F5" ], "name" : "u00BAu00DAu00C1uD82BuDF6D" }, { "cities" : [ "u00C9u00EEu00DBu00DA", "u00B9u00E3u00D6u00DD" ], "name" : "u00B9u3DAB" } ] } */ //2. cities.add("daqing"); cities.add("haerbin"); temp.set("name", "heilongjiang"); temp.set("cities", cities); province.add(temp); cities.clear(); temp.clear(); cities.add("shenzhen"); cities.add("guangzhou"); temp.set("name", "guangdong"); temp.set("cities", cities); province.add(temp); root.set("province", province); root.set("country", "中国"); Poco::Dynamic::Var js(root); std::string str = js.toString(); /* 结果如下 { "country" : "中国", "province" : [ { "cities" : [ "daqing", "haerbin" ], "name" : "heilongjiang" }, { "cities" : [ "shenzhen", "guangzhou" ], "name" : "guangdong" } ] } */ std::ofstream ofile("test.json"); root.stringify(ofile, 4); ofile.close(); } int main() { CreateJson(); return 0; }
- 解析(sJson必须是UTF8编码的)

try { std::string sJson = "{"name":"LiBai","friends":["DuFu","HEZHIZHANG"]}"; // "{"名字":"李白"}"; Poco::JSON::Parser parser; //sJson必须是utf8的,可能只支持 7bit的ASCII码,因为有中文时解析出错:“No legal UTF8 found” Poco::Dynamic::Var ret = parser.parse(sJson); Poco::JSON::Object::Ptr pObj = ret.extract<Poco::JSON::Object::Ptr>(); //1. use Object::Ptr std::string sName = pObj->get("name").toString(); Poco::JSON::Array::Ptr pArr = pObj->getArray("friends"); for (int i = 0; i < pArr->size(); ++i) { std::string s = pArr->get(i).toString(); } for (auto it = pArr->begin(); it != pArr->end(); ++it) { std::string s = it->toString(); } //2. use DynamicStruct Poco::DynamicStruct ds = *pObj; std::string sName2 = ds["name"]; std::string sFriend1 = ds["friends"][0]; std::string sFriend2 = ds["friends"][1]; } catch (Poco::JSON::JSONException& e) { std::string sErr = std::string(e.what()) + "===" + e.message(); }
- 生成和解析

Poco::JSON::Object root, temp; Poco::JSON::Array province, cities; root.setEscapeUnicode(true);//汉字用Unicode表示,例如:"黑龙江"->"u9ED1u9F99u6C5F" std::wstring wsTmp = L"大庆"; cities.add(wsTmp); wsTmp = L"哈尔滨"; cities.add(wsTmp); wsTmp = L"黑龙江"; temp.set("name", wsTmp); temp.set("cities", cities); province.add(temp); root.set("province", province); std::wstring sC(L"中国"); root.set("country", sC); Poco::Dynamic::Var js(root); std::string str = js.toString();//自动转为utf8字符编码 /* 虽然结果如下,但用Poco::JSON可以解析 { "country" : "涓�浗", "province" : [ { "cities" : [ "u5927u5E86", "u54C8u5C14u6EE8" ], "name" : "u9ED1u9F99u6C5F" } ] } */ try { std::string sJson = str;//"{"name":"LiBai","friends":["DuFu","HEZHIZHANG"]}"; // "{"名字":"李白"}"; Poco::JSON::Parser parser; //sJson必须是utf8的,可能只支持 7bit的ASCII码,因为有中文时解析出错:“No legal UTF8 found” Poco::Dynamic::Var ret = parser.parse(sJson); Poco::JSON::Object::Ptr pObj = ret.extract<Poco::JSON::Object::Ptr>(); //2. use DynamicStruct Poco::DynamicStruct ds = *pObj; std::string stemp; std::string sName2 = ds["country"]; UTF8_to_ANSI(sName2, stemp);//中国 std::string sProvince = ds["province"][0]["name"]; UTF8_to_ANSI(sProvince, stemp);//黑龙江 std::string sCity1 = ds["province"][0]["cities"][0]; UTF8_to_ANSI(sCity1, stemp);//大庆 std::string sCity2 = ds["province"][0]["cities"][1]; UTF8_to_ANSI(sCity2, stemp);//哈尔滨 } catch (Poco::JSON::JSONException& e) { std::string sErr = std::string(e.what()) + "===" + e.message(); }
注:UTF8_to_ANSI 函数,参见 my functions.h 的第3个。
- Poco Base64 编码解码
基于字符串

#include <sstream> #include <Poco/Base64Encoder.h> #include <Poco/Base64Decoder.h> #include <Poco/StreamCopier.h> int main(int argc, char** argv) { //base64编码 std::string s1("12345"); std::stringstream ss; std::ostringstream oss; ss << s1; Poco::Base64Encoder encoder(oss); Poco::StreamCopier::copyStream(ss, encoder); encoder.close();//这句很重要 std::string s2 = oss.str();//"MTIzNDU=" /////////////////////////////// // 注意:若无 encoder.close(); // 则, "123456" -> "MTIzNDU2" ok // "12345" -> "MTIz" error. because of "MTIz" ->(123) /////////////////////////////// return 0; } //解码 std::stringstream ss; std::ostringstream oss; ss << "MTIzNDU2"; Poco::Base64Decoder decoder(ss); Poco::StreamCopier::copyStream(decoder, oss); std::string s = oss.str();//"123456" //或者用下面的代替上两行 //std::string s2; //Poco::StreamCopier::copyToString(decoder, s2); //参考:https://blog.csdn.net/lizhi200404520/article/details/8860282 // 网上的例子 { std::string s("