文章目录

  • 1.解析json字符串数据
  • 2.生成Json格式的数据
  • 3.操作Json数组
  • 4.使用字符串流转换Json格式数据
  • 5.使用键值检索Json结构中的数据
  • 6.使用原始字符串避免字符转义
  • 7.开启Json结构的注释模式(允许字符串中添加Json注释)
  • 8.设置Json结构字符串的打印输出模式
  • 9.使用Json模板结构操作字符串
  • 10.Json结构的键值不自动排序保持插入顺序
  • 11.处理Json结构中转义字符

Json是一种轻量级数据交换格式,在网络通信过程中使用非常广泛。这里介绍一下如何通过Poco库操作Json数据信息。

1.解析json字符串数据

通过Poco提供的Parser类我们可以对Json字符串进行解析

int parserJsonContent()
{//json 输入源可以是字符串也可以是文件内容std::string json = "{\"name\" : \"lilei\",\"age\" : 32}";//读文件内容Poco::File file("D:\\test.json");std::string content;std::ostringstream ostr;if (file.exists()){Poco::FileInputStream fis("D:\\test.json", std::ios::in);Poco::StreamCopier::copyStream(fis, ostr);content = ostr.str();fis.close();}//抓取解析过程中的错误JSON::Parser parser;Dynamic::Var  result;try{result = parser.parse(json);}catch (JSON::JSONException& e){cout << e.message() << std::endl;return -1;}//获取对象的类型并解析if (result.type() == typeid(JSON::Object::Ptr)){JSON::Object::Ptr object_ptr = result.extract<JSON::Object::Ptr>();Dynamic::Var name = object_ptr->get("name");//指定键值不存在的时候的缺省值std::string default_string = object_ptr->optValue<string>("name", "moren");//判断键值的类型if (name.type() == typeid(string)){string str_name = name;}Dynamic::Var age = object_ptr->get("age");if (age.isInteger() || age.isNumeric()){int age_int = age;}//转成对应的动态结构体来进行访问DynamicStruct ds = *object_ptr;if (ds.contains("name") && ds["name"].isString()){string name = ds["name"];}if (ds.contains("age") && ds["age"].isInteger()){int age_int = ds["age"];cout << age_int;}}return 0;
}

2.生成Json格式的数据

通过字符串流,我们可以很方便的将Json结构类转化成对应的字符串。

int generateJsonData()
{//生成JSON对象并转化成字符串JSON::Object object;object.set("name", "liming");object.set("age", 32);std::ostringstream ostr_stream;object.stringify(ostr_stream);std::string result_str = ostr_stream.str();cout << result_str << std::endl;//查找键值列表JSON::Object::NameList nam_list = object.getNames();JSON::Object parent;parent.set("person1", object);parent.set("pareson2", object);std::ostringstream ostr_stream_object;parent.stringify(ostr_stream_object);cout << ostr_stream_object.str() << std::endl;//生成JSON结构体并转化成字符串//结构体和对象之间可以相互转换//结构体可以层级嵌套使用跟Object一样DynamicStruct my_struct;my_struct.insert("name", "dafei");my_struct.insert("age", 32);string result = my_struct.toString();cout << result << std::endl;DynamicStruct parent_struct;parent_struct.insert("person1", my_struct);parent_struct.insert("person2", my_struct);cout << parent_struct.toString() << std::endl;return 0;
}

3.操作Json数组

int useJsonArray()
{//生成字符串数组JSON::Array nameArray;nameArray.add("liming");nameArray.add("zhanghong");nameArray.add("wangfei");JSON::Object root_obj;root_obj.set("nameList", nameArray);std::ostringstream ostr_stream_object;root_obj.stringify(ostr_stream_object);cout << ostr_stream_object.str() << std::endl;Dynamic::Array struct_array;struct_array.push_back("liming");struct_array.push_back("zhanghong");struct_array.push_back("wangfei");DynamicStruct parent_struct;parent_struct.insert("nameList", struct_array);cout << parent_struct.toString() << std::endl;//生成对象数组JSON::Object object;object.set("name", "liming");object.set("age", 32);JSON::Array objectArray;objectArray.add(object);objectArray.add(object);objectArray.add(object);JSON::Object obj_root_obj;obj_root_obj.set("personList", objectArray);std::ostringstream stream_object;obj_root_obj.stringify(stream_object);cout << stream_object.str() << std::endl;//动态对象数组Dynamic::Array obj_struct_array;obj_struct_array.push_back(object);obj_struct_array.push_back(object);DynamicStruct obj_parent_struct;obj_parent_struct.insert("structList", obj_struct_array);cout << obj_parent_struct.toString() << std::endl;return 0;
}

4.使用字符串流转换Json格式数据

void useStringfy()
{std::ostringstream os;Dynamic::Var i = 123;JSON::Stringifier::stringify(i, os);DateTime dt;Dynamic::Var d = dt;JSON::Stringifier::stringify(d, os);JSON::Object jObj(false);jObj.set("foo\\", 0);jObj.set("bar/", 0);jObj.set("baz", 0);std::stringstream ss;jObj.stringify(ss);std::string json = "{ \"Simpsons\" : { \"husband\" : { \"name\" : \"Homer\" , \"age\" : 38 }, \"wife\" : { \"name\" : \"Marge\", \"age\" : 36 }, ""\"children\" : [ \"Bart\", \"Lisa\", \"Maggie\" ], ""\"address\" : { \"number\" : 742, \"street\" : \"Evergreen Terrace\", \"town\" : \"Springfield\" } } }";JSON::Parser parser;Dynamic::Var result;try{result = parser.parse(json);}catch (JSON::JSONException& jsone){std::cout << jsone.message() << std::endl;return;}std::ostringstream ostr;JSON::Stringifier::condense(result, ostr);cout << ostr.str() << std::endl;ostr.str("");JSON::Stringifier::stringify(result, ostr, 1);cout << ostr.str() << std::endl;}

5.使用键值检索Json结构中的数据

int useQuery()
{std::string json = "{ \"name\" : \"Franky\", \"children\" : [ \"Jonas\", \"Ellen\" ], \"address\": { \"street\": \"A Street\", \"number\": 123, \"city\":\"The City\"} }";JSON::Parser parser;Dynamic::Var  result;try{result = parser.parse(json);}catch (JSON::JSONException& jsone){std::cout << jsone.message() << std::endl;return -1;}JSON::Query query(result);//查找JSON中的某个数据,如果key不存在,或者类型不符的话返回后面的默认值//查找children数组的第一个std::string first_child = query.findValue("children[0]", "");//查找某个配置项int number = query.findValue<int>("number", 0);//查找对象JSON::Object address;address.set("dummy", 123);JSON::Object pAddress = query.findObject("address",address);JSON::Object::Ptr pAddress_ptr = query.findObject("address");//查找数组JSON::Array::Ptr pChildren = query.findArray("children");JSON::Array children;children.add("dummy");query.findArray("no children", children);}

6.使用原始字符串避免字符转义

int useRawString()
{std::string raw_string = R"json({"Name":"feifei","age":23})json";JSON::Parser parser;Dynamic::Var  result;try {result = parser.parse(raw_string); }catch (JSON::JSONException& e){return -1;}DynamicStruct stru = *result.extract<JSON::Object::Ptr>();cout << stru.toString() << std::endl;return 0;
}

7.开启Json结构的注释模式(允许字符串中添加Json注释)

int allowCommentsInJson()
{std::string json = "{ \"name\" : \"Franky\" /* father */, \"children\" : [ \"Jonas\" /* son */ , \"Ellen\" /* daughter */ ] }";JSON::Parser parser;Dynamic::Var result;parser.setAllowComments(true);try{result = parser.parse(json);}catch (JSON::JSONException& exception){std::cout << exception.message() << std::endl;}return 0;
}

8.设置Json结构字符串的打印输出模式

int setformatOutput()
{std::string json = "{ \"name\" : \"Homer\", \"age\" : 38, \"wife\" : \"Marge\", \"age\" : 36, \"children\" : [ \"Bart\", \"Lisa\", \"Maggie\" ] }";JSON::Parser parser;std::ostringstream ostr;JSON::PrintHandler::Ptr pHandler = new JSON::PrintHandler(ostr);parser.setHandler(pHandler);parser.parse(json);cout << ostr.str() << std::endl;//设置缩进一个字符pHandler->setIndent(1);ostr.str("");parser.reset();parser.parse(json);cout << ostr.str() << std::endl;return 0;
}

9.使用Json模板结构操作字符串

void useTemplate()
{JSON::Template tpl;tpl.parse("Hello world! From <?= person.name?>.\n<?if person.tooOld?>You're too old.<?endif?>");JSON::Object::Ptr data = new JSON::Object();JSON::Object::Ptr person = new JSON::Object();data->set("person", person);person->set("name", "Franky");person->set("tooOld", true);std::ostringstream ostr;tpl.render(data, ostr);std::cout << ostr.str();//ostr.str() == "Hello world! From Franky.\nYou're too old.";
}

10.Json结构的键值不自动排序保持插入顺序

int keepinsertOrder()
{//key值的显示顺序和插入顺序保持一致//不对key值顺序进行调整排序JSON::Object presObj(Poco::JSON_PRESERVE_KEY_ORDER);presObj.set("first", 0);presObj.set("second", 0);presObj.set("third", 0);std::stringstream ss;presObj.stringify(ss);cout << ss.str() << std::endl;std::string json = "{ \"Simpsons\" : { \"husband\" : { \"name\" : \"Homer\" , \"age\" : 38 }, \"wife\" : { \"name\" : \"Marge\", \"age\" : 36 }, ""\"children\" : [ \"Bart\", \"Lisa\", \"Maggie\" ], ""\"address\" : { \"number\" : 742, \"street\" : \"Evergreen Terrace\", \"town\" : \"Springfield\" } } }";//引入Handler确保解析顺序和字符串中的顺序保持一致JSON::ParseHandler::Ptr pHandler = new JSON::ParseHandler(true);JSON::Parser parser(pHandler);
}

11.处理Json结构中转义字符

void handleEscape0()
{Poco::JSON::Object::Ptr json = new Poco::JSON::Object();std::string nullString("B\0b", 3);json->set("name", nullString);std::stringstream ss;json->stringify(ss);int ret = ss.str().compare("{\"name\":\"B\\u0000b\"}");//包含转义字符Poco::JSON::Parser parser(new Poco::JSON::ParseHandler());Dynamic::Var result = parser.parse(ss.str());JSON::Object::Ptr object = result.extract<JSON::Object::Ptr>();assert(object->get("name").extract<std::string>() == nullString);
}

Poco库使用:操作Json格式数据相关推荐

  1. php json 默认值,php操作JSON格式数据的实现代码

    知识点: 1.JSON数据格式介绍 2.对数据编码成JSON格式 3.对JSON数据进行解码,并操作 JSON数据格式表示方式如下: { "programmers": [ { &q ...

  2. php json数据值,php操作JSON格式数据

    知识点: 1.JSON数据格式介绍 2.对数据编码成JSON格式 3.对JSON数据进行解码,并操作 JSON数据格式表示方式如下: { "programmers": [ { &q ...

  3. php操作 JSON格式数据

    用php将数据编码成JSON格式: <?php  //php中用数组表示JSON格式数据 $arr = array(  'firstname' => iconv('gb2312', 'ut ...

  4. ajax json 渲染 html,jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例

    本文实例讲述了jquery+ajax+js实现请求json格式数据并渲染到html页面操作.分享给大家供大家参考,具体如下: 1.先给json格式的数据: [ {"id":1,&q ...

  5. python操作json_Python学习之利用Python处理JSON格式数据

    最近在研究利用zabbix的自动发现功能来监控一台服务器上的多个Redis端口.网上有篇文章写个Python程序来发现Redis端口并显示成JSON格式.这里就学习下Python如何处理JSON格式数 ...

  6. [工具库]JOJSONBuilder工具类——一键把多个bean对象数据转换为JSON格式数据

    本人大四即将毕业的准程序员(JavaSE.JavaEE.android等)一枚,小项目也做过一点,于是乎一时兴起就写了一些工具. 我会在本博客中陆续发布一些平时可能会用到的工具. 代码质量可能不是很好 ...

  7. 如何压缩Json格式数据,减少Json数据的体积?

    一.背景 最近刚刚做完一个中文汉字笔画排序的功能,链接如下: [我的Android进阶之旅]Android实现中文汉字笔划(笔画)排序.中文拼音排序.英文排序的国家地区选择界面 [我的Java开发学习 ...

  8. python处理json格式数据

    文章目录 一.背景 1.序列化 1.1 json.dump() 1.2 to_json() 1.3json.dumps() 2.反序列化 2.1 json.load() 2.2 read_json() ...

  9. C++解析JSON格式数据

    因为项目原因需要使用VC6.0解析JSON格式数据,这里首先介绍VC6.0编译JSON解析库的步骤. 首先你必须在http://sourceforge.net/projects/jsoncpp/fil ...

最新文章

  1. 7、vue中将token存到cookie
  2. golang中的runtime
  3. vb6编写用户权限_仅需三行代码,即可让Apache Shiro接管Swagger权限认证
  4. django13:Session与Cookie操作
  5. macOS Big Sur应用图标替换教程︳big sur图标包
  6. Leangoo到底好在哪里?
  7. Python花式编程案例集锦(9):sorted()函数中消失的cmp参数
  8. android dialog的封装,Android系统Dialog的简单封装
  9. 5天学python_人生苦短,我将学习Python基本句子(第5天),我学,基础,篇,语句,Day5...
  10. 奇门对接需求设计_奇门格局详解_-_么学声_张志春
  11. 路由器k2固件改系统时间
  12. Java POI输出excel单元格画斜线
  13. Halcon图像分割-区域提取
  14. ab并发测试-Linux
  15. Lazy Binomial Heaps
  16. jshop测试分析总览
  17. 4399怎么修复游戏服务器,[ 服务器 ]4399官方服务器(改ip了)
  18. Unreal 入门-EQS
  19. SSD算法的改进版之R-SSD
  20. 老java手机有什么什么用,80后熟悉的这些手机功能,用过3种以上说明你已经老了...

热门文章

  1. xv6的sleep和wakeup
  2. 比尔·盖茨表示 AI应被用来改善教育医疗
  3. 一文带你了解APS生产计划排程系统
  4. [Java练习] 学生查询系统
  5. malloc用户态内存分配
  6. java故事之致敬坚持梦想的人
  7. 智能网联「中国百强供应商」都有谁?8月30-31日现场揭晓
  8. Visual Studio 增加每行最多字符数限制参考线
  9. 百度2016研发工程师在线编程题
  10. C语言射击类打飞机小游戏