天道酬勤,学无止境

get array data from json file using rapidjson

I'm new in rapidjson. I have test.json which contains {"points": [1,2,3,4]}

and I use following code to get data of array "points"

std::string fullPath = CCFileUtils::sharedFileUtils()->fullPathForFilename("json/deluxe/treasurebag.json");

    unsigned long bufferSize = 0;

    const char* mFileData = (const char*)CCFileUtils::sharedFileUtils()->getFileData(fullPath.c_str(), "r", &bufferSize);

    std::string clearData(mFileData);
    size_t pos = clearData.rfind("}");
    clearData = clearData.substr(0, pos+1);
    document.Parse<0>(clearData.c_str());
    assert(document.HasMember("points"));

    const Value& a = document["points"]; // Using a reference for consecutive access is handy and faster.
    assert(a.IsArray());
    for (SizeType i = 0; i < a.Size(); i++) // rapidjson uses SizeType instead of size_t.
        CCLOG("a[%d] = %d\n", i, a[i].GetInt());

and its result is

Cocos2d: a[0] = 1
Cocos2d: a[1] = 2
Cocos2d: a[2] = 3
Cocos2d: a[3] = 4

as expected. But now when I try to get data (get x and y) from an array like this

{"points": [{"y": -14.25,"x": -2.25},{"y": -13.25,"x": -5.75},{"y": -12.5,"x": -7.25}]}

an error occured and threw away in compiler:

//! Get the number of elements in array.
    SizeType Size() const { RAPIDJSON_ASSERT(IsArray()); return data_.a.size; }

Can anyone explain what i did wrong or something's missed? Sorry for my bad English.

Any helps would be appreciated.

Thanks.

评论

Using index for enumerating all array elements is correct, but I personally find it obsolete since C++11 range-for was introduced.

With C++11 you can enumerate values this way:

for(const auto& point : document["points"].GetArray()){
    CCLOG("{x=%f, y=%f}", point["x"].GetDouble(), point["y"].GetDouble());
}

You can also enumerate object's fields the same way (if you need to):

for(const auto& field : point.GetObject()) {
    field.name.GetString(); // Use field's name somehow...
    field.value.GetDouble(); // Use field's value somehow...
}

Finally found it myself, The correct syntax would be document["points"][0]["x"].GetString()

for (SizeType i = 0; i < document["points"].Size(); i++){
    CCLOG("{x=%f, y=%f}", document["points"][i]["x"].GetDouble(), document["points"][i]["y"].GetDouble());
}

and the output is

Cocos2d: {x=-2.250000, y=-14.250000}
Cocos2d: {x=-5.750000, y=-13.250000}
Cocos2d: {x=-7.250000, y=-12.500000}

Hope it helps. :D

受限制的 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 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协议
  • 使用 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
  • Getting n objects and their field from JSon, then store them as class object
    Im trying to get information about my objects from JSon file. It contains n objects (2 for example) 4 fields each. I parse .json by rapidjson and my IDE is Qt Creator. I already tried using Pointers desribed at http://rapidjson.org/md_doc_pointer.html#JsonPointer and Query Objects from their basic tutorial, but somehow I can't get it working. that's how example .json file would look. { "opiekun1" : { "imie": "Maksym", "nazwisko": "Zawrotny", "email": "maksym@wp.pl", "haslo": "herbatka"}, "opiekun2" : { "imie": "Filip", "nazwisko": "Szatkowski", "email": "filip@wp.pl", "haslo": "kawusia"} } I
  • 从 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
  • 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 ,在另一个数组的数组中获取一个值(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简介及使用
    文章目录 前言测试代码其他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 , get a value inside an array of another array
    I need to sparse a json of this kind with rapidjson : { "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] ] } To get value of id "source_code" quite simple
  • 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\" : []
  • 如何使用整数作为键/名称将成员添加到 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
  • 浅谈整理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
  • 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
  • 如何使用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
  • How to read json file using rapidjson and output to std::string?
    How can I read a *.json file and put the output on a std::string? I have this sample, but I always get null on std::string. #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())
  • rapidjson: working code for reading document from file?
    I need a working c++ code for reading document from file using rapidjson: https://code.google.com/p/rapidjson/ In the wiki it's yet undocumented, the examples unserialize only from std::string, I haven't a deep knowledge of templates. I serialized my document into a text file and this is the code I wrote, but it doesn't compile: #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
  • json Comparison in c++
    I am a little stuck here can anyone help please. #include <iostream> #include "include/rapidjson/document.h" #include "include/rapidjson/writer.h" #include "include/rapidjson/prettywriter.h" //#include "include/rapidjson/stringbuffer.h" using namespace std; using namespace rapidjson; class test { public: static bool isEqual(const string &item1, const string &item2, const string &temp) { Document d1; d1.Parse(item1.c_str()); Document d2; d2.Parse(item2.c_str()); Document d3; d3.Parse(temp.c_str()); bool a = true; bool b = isJsonEqual(d1, d2, d3, a); } static bool isJsonEqual(Value &v, Value &v1
  • 使用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
  • 为什么我在编译 RapidJSON 时收到错误(Why I receive error while compiling RapidJSON)
    问题 使用 RapidJSON 解析 JSON 文件时,出现这些错误。 这是 JSON 文件的一部分: { "header":{ "protocolVersion":2, "messageID":2, "stationID":224 }, "cam":{ "generationDeltaTime":37909, "camParameters":{ "basicContainer":{ "stationType":5, 这是代码 doc.Parse(pr); const auto& header = doc["header"]; header.protocolVersion = doc["header"]["protocolVersion"].GetInt(); header.messageID = doc["header"]["messageID"].GetInt(); header.stationID = doc["header"]["stationID"].GetInt(); const auto& cam = doc["cam"]; cam.camParameters.basicContainer.stationType = doc["cam"]["camParameters"]["basicContainer"]["stationType"].GetInt(); const
  • C++中的json比较(json Comparison in c++)
    问题 我有点卡在这里,有人可以帮忙吗? #include <iostream> #include "include/rapidjson/document.h" #include "include/rapidjson/writer.h" #include "include/rapidjson/prettywriter.h" //#include "include/rapidjson/stringbuffer.h" using namespace std; using namespace rapidjson; class test { public: static bool isEqual(const string &item1, const string &item2, const string &temp) { Document d1; d1.Parse(item1.c_str()); Document d2; d2.Parse(item2.c_str()); Document d3; d3.Parse(temp.c_str()); bool a = true; bool b = isJsonEqual(d1, d2, d3, a); } static bool isJsonEqual(Value &v, Value &v1, Value &v2, bool &a) { /*
  • iterate and retrieve nested object in JSON using rapidjson
    I am parsing a JSON structure which is similar as follows { "item1" : "value1" "item2" : "value2" // ... "itemn" : { "outernestedItem1" : { "innerNestedItem1" : "valuen1" "innerNestedItem2" : "valuen2" } // .... "outernestedItemn" : { "innerNestedItem1" : "valuen1" "innerNestedItem2" : "valuen2" } } } The number of outer nested items is not fixed, so I was iterating using iterator from rapidjson, inner-nested objects variables are fixed, so I can get access to them using []. const rapidjson::Value& itemn = document["itemn"]; for (rapidjson::Value::ConstMemberIterator itr = itemn.MemberBegin()