如何使用MongoDB自带的json库来反序列json字符串

2023-10-26

2012-03-23 17:46  6170人阅读  评论(0)  收藏  举报
  分类:
 

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录(?)[+]


需求:

在对mongodb中的字段值进行解析的时候发现,因为这个值是json字符串,需要对其进行反序列化。

解决方法:

首先想到了到http://www.json.org/json-zh.html网站去找相应的C++库,试了一下jsoncpp和JSON Spirit,因为是用scons来构建了,装了一下,编译以后玩不起来,放弃了。再试JSON Spirit,(http://www.codeproject.com/Articles/20027/JSON-Spirit-A-C-JSON-Parser-Generator-Implemented), 这东东不错,好像是依赖于Boost Spirit的,这个我也装了,安装过程还是满方便的,因为我的C++项目都是用CMake的,这个也是用它的,所以编译安装没有遇到什么问题。下面给出一个相应的例子:

[cpp]  view plain  copy
  1. #include <json_spirit.h>  
  2.   
  3. const std::string test =  
  4. "{"  
  5. "    \"text\": \"Home-plate umpire Crawford gets stung http://tinyurl.com/27ujc86\","  
  6. "    \"favorited\": false,"  
  7. "    \"source\": \"<a href=\\\"http://apiwiki.twitter.com/\\\" rel=\\\"nofollow\\\">API</a>\","  
  8. "    \"user\": {"  
  9. "        \"name\": \"Johnathan Thomas\""  
  10. "    }"  
  11. "}";  
  12.   
  13.   
  14. int main() {  
  15.     namespace js = json_spirit;  
  16.     js::mValue top;  
  17.     js::read(std::string(test), top);  
  18.     json_spirit::mObject obj = top.get_obj();  
  19.     std::cout << "--------" << std::endl;  
  20.       
  21.     std::cout   
  22.       << obj["text"     ].get_str()  << "\n"  
  23.       << obj["favorited"].get_bool() << "\n"  
  24.       << obj["source"   ].get_str()  << "\n"  
  25.       << obj["user"     ].get_obj()["name"].get_str() << "\n";  
  26. }  

下面想到了mongodb有自己的bson结构,这个东东和json是差不多的,在mongodb的源代码包里找到了json.h这个文件看,盾到了fromjson这个方法,看来能行。呵呵
下面是我的测试代码,因为我的value中用到了array,这里还用到了别外一个把BSONObj转换成Array<BSONObj>的方法。


[cpp]  view plain  copy
  1. #include <db/json.h>   // load fromjson method  
  2.   
  3. #include <iostream>  
  4. #include <string>  
  5. const std::string test =  
  6.     "{ \"specs\" : "  
  7.     " [ {\"id\":\"value1\" , \"name\":\"jack\"},"  
  8.     "   {\"id\": \"value2\", \"name\":\"jack2\"},"  
  9.     "{\"id\": \"value3\", \"name\":\"jack3\"}"  
  10.     " ]"  
  11.     "}";  
  12.   
  13.   
  14. int main()  
  15. {  
  16.     try{  
  17.         // { "specs" :  [ {"id":"value1" , "name":"jack"},   {"id": "value2", "name":"jack2"},{"id": "value3", "name":"jack3"} ]}  
  18.         std::cout << "Test json string:" << test << std::endl;  
  19.   
  20.   
  21.         // parse json method from json.h file  
  22.         // throws MsgAssertionException if parsing fails.  The message included with  
  23.         // this assertion includes a rough indication of where parsing failed.  
  24.         mongo::BSONObj obj = mongo::fromjson(test);  
  25.         mongo::BSONObj eles = obj["specs"].Obj();   // get array obj  
  26.   
  27.   
  28.         /** add all values of the object to the specified vector.  If type mismatches, exception. 
  29.             this is most useful when the BSONObj is an array, but can be used with non-arrays too in theory. 
  30.  
  31.  
  32.             example: 
  33.               bo sub = y["subobj"].Obj(); 
  34.               vector<int> myints; 
  35.               sub.Vals(myints); 
  36.         */  
  37.   
  38.   
  39.         vector<mongo::BSONObj> specs;  
  40.         eles.Vals(specs);  
  41.   
  42.   
  43.         // print values  
  44.         for(int i = 0; i < 3; ++i)  
  45.             std::cout << specs.at(i)["id"].String() << ":" <<  specs.at(i)["name"].String()<< endl;  
  46.     }  
  47.     catch(const mongo::MsgAssertionException& e)  
  48.     {  
  49.         std::cout << "parse exception " << e.what() << endl;  
  50.     }  
  51. }  


运行结果:

[plain]  view plain  copy
  1. gxl@gxl-desktop:~/Test_place$ g++ sample.cpp -o sample -I/usr/local/include/mongo/ -lmongoclient  
  2. gxl@gxl-desktop:~/Test_place$ ./sample   
  3. Test json string:{ "specs" :  [ {"id":"value1" , "name":"jack"},   {"id": "value2", "name":"jack2"},{"id": "value3", "name":"jack3"} ]}  
  4. value1:jack  
  5. value2:jack2  
  6. value3:jack3 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用MongoDB自带的json库来反序列json字符串 的相关文章

  • 跑跑yolov5吧

    跑跑yolov5 如果只是要快速上手训练得到训练结果 我的建议是直接使用b导的代码 别问为什么 问就是我是b导小迷弟 但是 b导的代码好像是自己写的 会存在 下载的权重文件是pth 最后得到的文件是pth文件 的问题 因为我想要用来跑自动标
  • c语言数字中英文转换器,C现代实现方法 数字转换为英文单词

    include int main int d 0 a 0 b 0 printf Enter a two digit number scanf d d if d 10 0 d 100 0 perror d exit 1 a d 10 b d
  • react v6路由拦截

    本文展示路由的配置以及路由拦截的实现方法 版本 react 17 0 2 react router dom 6 0 2 代码 App js import React from react import RootRoutes from rou
  • P1085不高兴的津津-C++编程解析-分支

    解题思路 通过题目可知 输入是津津一周内每天校内学习和校外学习的时间 由输入我们可以计算出津津每天的学习总时间 如果当天的学习时间比前一天的学习时间长 津津的不高兴程度就大 通过对7天的遍历 我们可以得出津津不高兴程度最大的那一天 题目中告

随机推荐

  • distinct与group by的查询效率对比

    数据量 1069753条 数据库 distinct 第二次 group by 第二次 版本 Drios 1 788s 0 751s 2 554s 0 637s 5 1 0 数据量 1021343条 Spark 6s 2s 3s 2s 3 0
  • laravel Dcat Admin Class name must be a valid object or a string

    1 问题 安装Laravel后台系统Dcat Admin 2 x报错 Class name must be a valid object or a string 2 解决 step1 更新compoer composer update st
  • LINUX安装erlang

    下载erlang erlang下载 http www erlang org download otp src 18 0 tar gz 安装 1 安装erlang tar xvzf otp src 18 0 tar gz cd otp src
  • 计算机视觉论文-2021-03-31

    本专栏是计算机视觉方向论文收集积累 时间 2021年3月31日 来源 paper digest 欢迎关注原创公众号 计算机视觉联盟 回复 西瓜书手推笔记 可获取我的机器学习纯手推笔记 直达笔记地址 机器学习手推笔记 GitHub地址 1 T
  • Springboot整合RabbitMQ

    一 Springboot整合RabbitMQ的代码实现 1 引入Springboot整合RabbitMQ的依赖
  • html怎么把图片左移_css怎么让图片向左移动?

    css怎么让图片向左移动 下面本篇文章给大家介绍一下使用CSS让图片向左移动的方法 有一定的参考价值 有需要的朋友可以参考一下 希望对大家有所帮助 css3 功能非常强大 几行代码就可以做到非常不错的移动效果 算不上动态页面 css让图片向
  • python主要内容总结_Python基础知识点总结【面试必过】

    数据类型 数字类型 int float bool True or False complex 字符串 str or 相关操作 通过下标获取内容 对字符串进行多步操作前一般需要进行切片 保证原字符串不会随着操作变化 注意 起始坐标和结束坐标都
  • react获取表单form对象的两种方式,获取form后进行重置

    1 函数组件 const CreateForm React FC
  • 沁恒CH32V307使用记录:GPIO与EXTI

    文章目录 目的 GPIO 通用输入输出接口 基础说明 初始化 输出 输入与电平读取 锁定机制 EXTI 外部中断 基础说明 使用演示 总结 目的 GPIO是单片机最基础的功能 EXTI最常用的场景就是GPIO用于输入时使用 这篇文章将对CH
  • upload-labs上传漏洞靶场--pass1,2,11,12,17

    upload labs上传漏洞靶场 1 pass 1改变文件后缀名 新建一句话木马文件 并上传 发现 php文件上传失败 只能使用图片上传 我们修改 php文件的后缀名为 jpg上传 并使用burp抓包 将 jpg修改成 php后 关闭拦截
  • React实现列表拖放

    记录React实现列表拖放 我是站在巨人的肩膀上哈哈 原作者里面用的类实现 因为我需要用组件实现 所以进行了改动和备注 害怕原作者的编辑链接失效 所以记录一下 原作者 React通过原生鼠标事件实现拖拽 drag and drop 列表重排
  • axios和async / await的基本用法

    文章目录 一 axios 的基本用法 1 基本语法 2 axios 的参数传递 3 axios 的响应结果 4 axios 的全局配置 5 axios拦截器配置 6 使用axios的请求示例 用于JSON类请求 7 使用axios的请求示例
  • 如何解决VS启动越来越慢

    VS2013 用久后 现在启动和打开项目变得很慢 解决方案 A 清理缓存 VS2010清理缓存 启用vs2010命令行工具 在vs2010命令提示符下 执行devenv exe resetuserdata VS2013清理缓存 开始 gt
  • 计算机网络各章节总结思维导图(物理层、数据链路层、网络层、传输层)

    本次思维导图的整理参考的书籍包括 计算机网络 第8版 谢希仁 计算机网络 自顶向下方法 以及 2023王道计算机网络考研复习指导 参考的视频包括 中科大郑烇 杨坚全套 计算机网络 自顶向下方法第7版 James F Kurose Keith
  • np.mgrid和np.stack

    我来补充一下Iris数据绘图时用到的几个函数 一 np mgrid np mgrid import numpy as np x1 np mgrid 1 5 1 print x1 n 最原始的np mgrid 创建一维数组 x np mgri
  • mysql导出数据为文本_MYsql数据文本形式导出与导入

    一 查询表结构 mysql gt desc province Field Type Null Key Default Extra id int 11 NO PRI NULL auto increment name varchar
  • too many open files解决办法

    在 etc security limit conf 最后加上如下两行 root soft nofile 32000 root hard nofile 32000
  • kafka+zookeeper安装配置

    1 安装zookeeper 步骤1 下载并解压zookeeper安装包tar zxvf zookeeper 3 4 11 tar gz 步骤2 配置环境变量 export ZOOK opt hadoop zookeeper 3 4 11 步
  • 小白学MySQL数据库必须了解的基础知识(二)

    文章目录 3 3 修改数据表 1 修改表名 2 修改字段名 3 修改字段的数据类型 4 添加字段 5 删除字段 6 修改字段的排列位置 3 4 删除数据表 4 表的约束 4 1 主键约束 1 单字段主键 2 多字段主键 4 2 非空约
  • 如何使用MongoDB自带的json库来反序列json字符串

    如何使用MongoDB自带的json库来反序列json字符串 标签 jsonmongodbparsingstringexceptionuser 2012 03 23 17 46 6170人阅读 评论 0 收藏 举报 分类 NoSQL 3 C