天道酬勤,学无止境

rapidjson:从文件中读取文档的工作代码?(rapidjson: working code for reading document from file?)

问题

我需要一个工作 c++ 代码来使用 rapidjson 从文件中读取文档:https://code.google.com/p/rapidjson/

在 wiki 中它尚未记录,示例仅从 std::string 反序列化,我对模板没有深入的了解。

我将我的文档序列化为一个文本文件,这是我编写的代码,但它没有编译:

#include "rapidjson/prettywriter.h" // for stringify JSON
#include "rapidjson/writer.h"   // for stringify JSON
#include "rapidjson/filestream.h"   // wrapper of C stream for prettywriter as output
[...]
std::ifstream myfile ("c:\\statdata.txt");
rapidjson::Document document;
document.ParseStream<0>(myfile);

编译错误状态:错误:'Document'不是'rapidjson'的成员

我正在使用带有 mingw 和 rapidjson v 0.1 的 Qt 4.8.1(我已经尝试使用升级的 v 0.11,但错误仍然存​​在)

回答1
#include <rapidjson/document.h>
#include <rapidjson/istreamwrapper.h>
#include <fstream>

using namespace rapidjson; 
using namespace std;

ifstream ifs("test.json");
IStreamWrapper isw(ifs);
Document d;
d.ParseStream(isw);

请阅读 http://rapidjson.org/md_doc_stream.html 中的文档。

回答2

@Raanan 的答案中的FileStream显然已被弃用。 源代码中有一条注释说要改用FileReadStream

#include <rapidjson/document.h>
#include <rapidjson/filereadstream.h>

using namespace rapidjson;

// ...

FILE* pFile = fopen(fileName.c_str(), "rb");
char buffer[65536];
FileReadStream is(pFile, buffer, sizeof(buffer));
Document document;
document.ParseStream<0, UTF8<>, FileReadStream>(is);
回答3

在遇到类似的问题后才发现这个问题。 解决方案是使用 FILE* 对象,而不是 ifstream 和 rapidjson 自己的 FileStream 对象(您已经包含正确的标头)

FILE * pFile = fopen ("test.json" , "r");
rapidjson::FileStream is(pFile);
rapidjson::Document document;
document.ParseStream<0>(is);

您当然需要添加 document.h 包含(这回答了您的直接问题,但不会解决您的问题,因为您使用了错误的文件流):

#include "rapidjson/document.h"

然后(我可能会添加相当快的)文档对象填充文件内容。 希望能帮助到你!

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 从 JSon 获取 n 个对象及其字段,然后将它们存储为类对象(Getting n objects and their field from JSon, then store them as class object)
    问题 我试图从 JSon 文件中获取有关我的对象的信息。 它包含 n 个对象(例如 2 个),每个对象有 4 个字段。 我通过rapidjson 解析.json,我的IDE 是Qt Creator。 我已经尝试使用 http://rapidjson.org/md_doc_pointer.html#JsonPointer 和 Query Objects 从他们的基本教程中描述的指针,但不知何故我无法让它工作。 这就是示例 .json 文件的外观。 { "opiekun1" : { "imie": "Maksym", "nazwisko": "Zawrotny", "email": "maksym@wp.pl", "haslo": "herbatka"}, "opiekun2" : { "imie": "Filip", "nazwisko": "Szatkowski", "email": "filip@wp.pl", "haslo": "kawusia"} } 我通过以下方式获取 DOM 文档: FILE* fp = fopen(json_filename.c_str(), "rb"); char readBuffer[65536]; FileReadStream is(fp, readBuffer, sizeof(readBuffer)); Document d; d
  • LNK2019:使用 Rapidjson 的“未解析的外部符号”(LNK2019: “Unresolved external symbol” with rapidjson)
    问题 我有一个 Visual C++ 项目,我在其中添加了 Rapidjson 库,该库经过测试可以正常工作。 但是当我向嵌套类添加rapidjson::Document类型时,当我尝试编译时会LNK2019错误。 该项目是一个用于创建 DLL 的动态库。 这是我的main.h中的定义: class coreBD { string conn; string proxy; int type; Document test; enum dataBases { Sqlite, SqlServer, None }; string queryBD(string sSQL); string queryHTTP(string sSQL); string httpRequest(string url, string proxy); static string getNow(string format); static string urlEncode(string url); static bool startsWith(string source, string with); public: enum access { dbConn, HTTPProtocol }; //Nested class class jsonObj { string jsonStr; string message
  • Rapidjson的使用过程-Parse解析数组遇到的问题,附自己的解决方式
    RapidJson 数组使用的问题 简单介绍应用环境说明错误说明结论 简单介绍 关于RapidJSON,网上有很多资料,RapidJSON是腾讯开源的一个高效的C++ JSON解析器及生成器,它是只有头文件的C++库。RapidJSON是跨平台的,支持Windows, Linux, Mac OS X及iOS, Android。它的源码在https://github.com/Tencent/rapidjson/。这里也不过多介绍如何使用RapidJson,网上有很多如何使用,只介绍自己使用过程中遇到的问题,及其解决问题的方式。 应用环境说明 在我们的日常开发中,大多数项目都需要与数据库打交道,在多人同时开发一个项目时,不同的人有不同的分工,一般的MS项目,通常至少有一个负责数据库的开发,然后将数据库的操作封装成具体的接口,在给后端应用开发人员使用,这样,不管后端开发人员与数据库接口的开发人员是不是使用同一语言开发都无关紧要,只要数据库开发人员提供完善的接口给应用开发人员即可,比如我现在所在的公司,数据库开发人员使用的mysql + mybits + java语言提供接口(类似这种形式的接口:http://192.168.2.161:8080/JMVC/asset_excute/getFormworkById.r?formworkId=1),接口形式遵从http协议
  • json读取与写入
    rapidjson简介 rapidjson是腾讯的开源json解析框架,用c++实现。由于全部代码仅用header file实现,所以很容易集成到项目中。 rapidjson的性能是很出色的,其作者Milo Yipz做了28个C/C++ JSON库的评测,这个链接里有测试的结果截图https://www.zhihu.com/question/23654513。 rapidjson的另一个特点是对json的标准符合程度是100%的(在开启了full precision选项的情况下)。 这里是官方教程:http://rapidjson.org/zh-cn/md_doc_tutorial_8zh-cn.html 这里是原作者对rapidjson代码的剖析:http://miloyip.com/rapidjson/ 我之前的项目使用的是jsoncpp,最近在把解析json的代码交叉编译到iOS设备的时候,偶尔会出现crash的情况。虽然经过检查是代码写的有问题,不是jsoncpp的问题,在解决问题过程中尝试了rapidjson这个库,并顺便对比了一下jsoncpp和rapidjson对我项目中json文件的解析速度。 代码 三方库下载 头文件包含 #include "rapidjson/stringbuffer.h" #include "rapidjson/writer.h"
  • 如何使用rapidjson读取json文件并输出到std::string?(How to read json file using rapidjson and output to std::string?)
    问题 如何读取*.json文件并将输出放在std::string ? 我有这个示例,但我总是在std::string上得到null 。 #include <rapidjson/document.h> #include <rapidjson/istreamwrapper.h> #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h" #include <rapidjson/ostreamwrapper.h> #include <fstream> #include <iostream> using namespace rapidjson; using namespace std; void main() { ifstream ifs("input.json"); IStreamWrapper isw(ifs); Document d; d.ParseStream(isw); StringBuffer buffer; Writer<StringBuffer> writer(buffer); d.Accept(writer); std::string jsonStr(buffer.GetString()); if(jsonStr == "null") std::cout << "is null..." << std
  • 执行rapidjson的Document对象的拷贝(Perform a copy of Document object of rapidjson)
    问题 我正在创建一个类,我想在一个方法中返回我的类。 我的班级有一个rapidjson::Document对象。 你可以在这里看到以前的问题:LNK2019: "Unresolved external symbol" with rapidjson 正如我发现的那样,rapidjson 阻止您执行任何类型的Document对象副本,然后包含Document对象的类的默认副本失败。 我正在尝试定义自己的复制构造函数,但我需要执行对象的副本。 我看到了一种使用.Accept()方法假设复制对象的方法,但是在rapidjson::Document类中返回了很多错误: 错误 C2248:“无法访问在类‘rapidjson::GenericDocument’中声明的私有成员” 这是我的复制构造函数: jsonObj::jsonObj(jsonObj& other) { jsonStr = other.jsonStr; message = other.message; //doc = other.doc; doc.Accept(other.doc); validMsg = other.validMsg; } 我在库的代码(第 52-54 行)中发现“ Copy constructor is not permitted ”。 这是我的课: class jsonObj { string
  • 使用 Rapidjson 迭代和检索 JSON 中的嵌套对象(iterate and retrieve nested object in JSON using rapidjson)
    问题 我正在解析一个类似于以下的JSON结构 { "item1" : "value1" "item2" : "value2" // ... "itemn" : { "outernestedItem1" : { "innerNestedItem1" : "valuen1" "innerNestedItem2" : "valuen2" } // .... "outernestedItemn" : { "innerNestedItem1" : "valuen1" "innerNestedItem2" : "valuen2" } } } 外部嵌套项目的数量不固定,所以我使用rapidjson 中的迭代器进行迭代,内部嵌套对象变量是固定的,所以我可以使用[] 访问它们。 const rapidjson::Value& itemn = document["itemn"]; for (rapidjson::Value::ConstMemberIterator itr = itemn.MemberBegin(); itr != itemn.MemberEnd(); ++itr) { rapidjson::StringBuffer sb; rapidjson::Writer<rapidjson::StringBuffer> writer( sb ); itr->value.Accept(writer
  • Rapidjson 无法复制 `rapidjson::Document`(Rapidjson cannot copy `rapidjson::Document`)
    问题 我需要一个构造rapidjson::Document并返回的函数。 但是当我用这个原型写一个函数时: rapidjson::Document progressToJson(const Progress& progress); 我收到此错误: error LNK2019: unresolved external symbol "private: __thiscall rapidjson::GenericValue<struct rapidjson::UTF8<char>,class rapidjson::MemoryPoolAllocator<class rapidjson::CrtAllocator> >::GenericValue<struct rapidjson::UTF8<char>,class rapidjson::MemoryPoolAllocator<class rapidjson::CrtAllocator> >(class rapidjson::GenericValue<struct rapidjson::UTF8<char>,class rapidjson::MemoryPoolAllocator<class rapidjson::CrtAllocator> > const &)" (??0?$GenericValue@U?$UTF8@D@rapidjson
  • 如何使用rapidjson(已实现序列化)将对象序列化为std::string?(How to serialize object to std::string using rapidjson (Implemented serialize)?)
    问题 如何使用 Rapidjson 将对象序列化为 std::string ? 我已经实施 class Person{ public: std::string name; uint64 id; // uint64 is typedef template <typename Writer> void Serialize(Writer& writer) const { writer.StartObject(); writer.String("name"); writer.String(name); writer.String(("id")); writer.Uint64(id); writer.EndObject(); } std::string serialize(){ FileStream s(stdout); PrettyWriter<FileStream> writer(s); Serialize(writer); return ? /// There is a problem } } 问题是在序列化函数中返回什么? 回答1 问题已经很老了,如果您仍在寻找答案,那么这是@Lightness Races in Orbit 建议的问题 class Person{ public: std::string name; uint64 id; // uint64 is typedef
  • C++ rapidjson库解析json串
    描述 我们有了一个string类型的字符串,字符串是一个json串,使用C++的rapidjson库解析它 代码 按照你的需求自行更改代码,我这里只是个例子 形式1(已知大小读取内容) string内容为 { "store": [ { "grid_corners":[0,1], "status":3 }, { "grid_corners":[5,6], "status":10 } ] } #include <iostream> #include <string.h> #include "rapidjson/document.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h" #include "rapidjson/filewritestream.h" #include "rapidjson/prettywriter.h" #include "rapidjson/filereadstream.h" int main(int argc, char** argv) { command_string = "{\"store\":[{\"grid_corners\":[0,1],\"status\":3},{\"grid_corners\":[5,6],\"status\":10}]}"; char*
  • 如何使用整数作为键/名称将成员添加到 Rapidjson 文档?(How can I add members to a rapidjson document using integers as the key/name?)
    问题 我正在使用 for 循环,并希望在向文档添加成员时使用迭代器 i 作为键/名称。 例如,我希望文档看起来像这样: {"1":"123.321","2":"456.654"} 这是我迄今为止尝试过的。 1. 将 i 转换为 const char* rapidjson::Value newDouble(6); for(int i = 0;i<laserScan.size();i++){ newDouble.SetDouble(laserScan[i]); const char* index = std::to_string(i).c_str(); d.AddMember(index,newDouble,d.GetAllocator()); } 这会生成一个编译器错误,告诉我 AddMember 只能采用 Rapidjson::GenericValue& 类型的参数: error: no matching function for call to ‘rapidjson::GenericDocument<rapidjson::UTF8<> >::AddMember(const char*&, rapidjson::Value&, rapidjson::MemoryPoolAllocator<>&)’ d.AddMember(index,newDouble,d.GetAllocator
  • 使用 Rapidjson 设置浮点精度(Set floating point precision using rapidjson)
    问题 有没有办法控制使用 Rapidjson 生成的 JSON 中的输出精度? 例如: writer.String("length"); writer.Double(1.0 / 3.0); 这会产生类似的东西: { length: 0.33333333 } 我发送了很多值,并且几个值只需要两位小数。 回答1 从来源 Writer& Double(double d) { Prefix(kNumberType); WriteDouble(d); return *this; } //! \todo Optimization with custom double-to-string converter. void WriteDouble(double d) { char buffer[100]; #if _MSC_VER int ret = sprintf_s(buffer, sizeof(buffer), "%g", d); #else int ret = snprintf(buffer, sizeof(buffer), "%g", d); #endif RAPIDJSON_ASSERT(ret >= 1); for (int i = 0; i < ret; i++) stream_.Put(buffer[i]); } 对于g转换,将使用样式e或f进行样式转换。 f
  • RapidJSON简介及使用
    文章目录 前言测试代码其他demo案例RapidJson使用范例(DOM解析json字符串并修改json中指定元素的值)文件对象模型(Document Object Model, DOM)API构建json value到DOM: 参考: 前言 RapidJSON是腾讯开源的一个高效的C++ JSON解析器及生成器,它是只有头文件的C++库。RapidJSON是跨平台的,支持Windows, Linux, Mac OS X及iOS, Android。它的源码在【】https://github.com/Tencent/rapidjson/,稳定版本为2016年发布的1.1.0版本。 官网地址 RapidJSON特点 RapidJSON小而全:它同时支持SAX和DOM风格的API,SAX解析器只有约500行代码。RapidJSON快:它的性能可与strlen()相比,可支持SSE2/SSE4.2加速,使用模版及内联函数去降低函数调用开销。RapidJSON独立:它不依赖于BOOST等外部库,它甚至不依赖于STL。RapidJSON对内存友好:在大部分32/64位机器上,每个JSON值只占16字节(除字符串外),它预设使用一个快速的内存分配器,令分析器可以紧凑地分配内存。RapidJSON对Unicode友好:它支持UTF-8、UTF-16、UTF-32(大端序/小端序)
  • Rapidjson ,在另一个数组的数组中获取一个值(Rapidjson , get a value inside an array of another array)
    问题 我需要用 Rapidjson 稀疏这种 json : { "errors":{}, "id":2326625, "source_code":"GOOG", "data": [ ["2010-01-12",-0.010565362832445,-0.010432881793793,-0.010144243731464,-0.017685262281432,-0.3275071624503], ["2010-01-13",-0.036084889870791,-0.016333087890756,-0.024003268530183,-0.0057299789787753,0.33911818660036], ["2010-01-14",0.012849006806501,0.0098673018033346,0.015523616828298,0.0047058823529412,-0.34735779281787], ["2010-01-15",0.013166015223205,-0.0010781671159029,-0.0081756037236783,-0.016698910497913,0.28200124010685] ] } 要获得 id "source_code" 的值非常简单: d.Parse<0>(json); printf("source_code" =
  • 使用rapidjson解析和组装json
    对比过boost解析和组装json,rapidjson的解析和组装对系统资源的占用率要小很多,具体原因不清楚。在解析配置文件等很小的json字符串时,boost解析速度还是非常快,但是对于频繁解析和组装来说,boost显得有些心有余而力不足,rapidjson解析和组装显得非常快。 rapidjson库的介绍可以在这个网址上查看:http://rapidjson.org/zh-cn/ rapidjson库的下载地址可以在git上下载:https://github.com/miloyip/rapidjson 由于rapidjson库只有头文件,所以下载下来后,不需要编译,直接放在项目中,添加头文件后就可以使用,这里不详细记录。 由于官方的实例代码不太容易看懂,调用层级很深,且加上了各种兼容判断等,所以下面记录一个简单的示例代码,为自己方便,也为需要的伙伴准备。 样例json 假如json的字符串为下面的格式: { "name": "zhangsan", "age": 20, "links": [ { "name": "Google", "url": "http://www.google.com" }, { "name": "Baidu", "url": "http://www.baidu.com" }, { "name": "SoSo", "url": "http://www
  • 浅谈整理C++关于Json的解析
    一、Json简述 1. JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名。 二、Json构成 2.值可以是对象、数组、数字、字符串或者三个字面值(false、null、true)中的一个。值中的字面值中的英文必须使用小写。 2.1对象由花括号括起来的逗号分割的成员构成,成员是字符串键和上文所述的值由逗号分割的键值对组成,如: 1 {"name": "John Doe", "age": 18, "address": {"country" : "china", "zip-code": "10000"}} 2.2数组是由方括号括起来的一组值构成,如: 1 [3, 1, 4, 1, 5, 9, 2, 6] 2.3 字符串与C或者Java的字符串非常相似。字符串是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character
  • c++ 使用 rapidjson 解析 json
    环境搭建 在 git 上下载源码 之后将这个目录添加到项目的 “附加包含目录”: 代码 #include <iostream> #include <Windows.h> #include <vector> #include <atlbase.h> #include <algorithm> #include <clocale> #include "rapidjson/document.h" #include "rapidjson/writer.h" using namespace std; /* https://blog.csdn.net/qq_27385759/article/details/79277434 { "test_int": 100, "test_float": 100.9, "test_string": "asd", "test_float_array": [], "test_object": { "vec_key": [1, 2, 3,], "i_key": 789, "f_key": 111.3, "s_key": "qwe" } } */ #define TEST_JSON "{\"test_int\": 100,\"test_float\" : 100.9,\"test_string\" : \"asd\",\"test_float_array\" : []
  • c++ rapidjson 解析本地 json 文件
    概述 使用 rapidjson 来解析本地的 json 文件。 本地 json 文件 { "num": 3, "subject": [ "Math", "English", "Computer Science" ], "info": [ { "value": "线性代数", "score": 70, "aveScore": 75.8 }, { "value": "四六级", "score": 500, "aveScore": 410.8 }, { "value": "数据结构", "score": 88, "aveScore": 65.4 } ] } 代码 #include <iostream> #include <string> #include <fstream> #include <windows.h> #include "rapidjson/prettywriter.h" #include "rapidjson/document.h" #include "rapidjson/istreamwrapper.h" using namespace std; using namespace rapidjson; //-----------------------------------------------------------------------------
  • Rapidjson 使用 JSON 字符串作为编写器输入的漂亮打印(rapidjson pretty print using JSON string as input to the writer)
    问题 遵循rapidjson文档,我能够以逐个键的方式生成打印精美的JSON输出,例如: rapidjson::StringBuffer s; rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(s); writer.StartObject(); writer.Key("hello"); writer.String("world"); writer.EndObject(); std::string result = s.GetString(); 但是,我想做同样的事情,但使用 JSON 字符串(即内容是有效 JSON 的std::string对象)来提供给编写器,而不是调用Key() 、 String()等。 查看 PrettyWriter API,我没有看到任何以这种方式传递 JSON 字符串的方法。 另一种方法是将解析后的 JSON 字符串作为rapidjson::Document对象传递,但我还没有发现这种可能性。 请知道如何做到这一点? 回答1 这是来自他们的文档: // rapidjson/example/simpledom/simpledom.cpp` #include "rapidjson/document.h" #include "rapidjson/writer.h" #include
  • 在 RapidJson 中循环数组并获取对象元素(Looping over an array in RapidJson and getting the object elements)
    问题 如何从 ConstrValueIterator 中获取值? 在这种情况下,我知道数组的元素是字典(又名对象)。 代码总结: for (rapidjson::Value::ConstValueIterator itr = rawbuttons.Begin(); itr != rawbuttons.End(); ++itr) { // Ok if (itr->HasMember("yes")) { // Ok auto somestring = itr["yes"]->GetString(); // error } } 回答1 嗯。 迭代器需要被取消引用或无论它被称为什么。 for (rapidjson::Value::ConstValueIterator itr = rawbuttons.Begin(); itr != rawbuttons.End(); ++itr) { // Ok if (itr->HasMember("yes")) { // Ok auto somestring = (*itr)["yes"]->GetString(); // bingo } } 回答2 它应该是 for (rapidjson::Value::ConstValueIterator itr = rawbuttons.Begin(); itr != rawbuttons.End(); +