天道酬勤,学无止境

使用 rapidjson 从 json 文件中获取数组数据(get array data from json file using rapidjson)

问题

我是 rapidjson 的新手。 我有test.json其中包含{"points": [1,2,3,4]}

我使用以下代码获取数组"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());

结果是

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

正如预期的那样。 但是现在当我尝试从这样的数组中获取数据(获取xy

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

发生错误并在编译器中丢弃:

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

谁能解释我做错了什么或遗漏了什么? 对不起,我的英语不好。

任何帮助将不胜感激。

谢谢。

回答1

使用索引来枚举所有数组元素是正确的,但我个人觉得它已经过时了,因为引入了 C++11 range-for。

使用 C++11,您可以通过以下方式枚举值:

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

您还可以以相同的方式枚举对象的字段(如果需要):

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

终于自己找到了,正确的语法是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());
}

输出是

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

希望能帮助到你。 :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 ,在另一个数组的数组中获取一个值(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的使用过程-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 获取 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
  • 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 中的嵌套对象(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
  • 浅谈整理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
  • 04rapidJson学习之往doc根对象插入数组,并在数组中插入对象案例
    04rapidJson学习之往doc根对象插入数组,并在数组中插入对象案例 概述: 上两篇我们已经讲了数组和对象的创建和遍历,下面我们使用个案例巩固一下,并且这个案例也是项目中用得比较多的方法。 1 代码 //往数组中插入对象.一般使用多个函数组成json时,都是从最小单位开始组建 //注意:这里并非是返回数组,只是开一个函数处理数组的引用而已。防止某个函数过长 void InsertObjInDoc(Document &doc, Value &array, std::string camera_uid, std::string message) { doc.SetObject();//实际上在test04已经设置了,但无妨 Document::AllocatorType &a = doc.GetAllocator(); //创建临时对象,循环放进数组中 for (auto i = 0; i < 5; i++) { Value o1(kObjectType); //一般需求时不需要这个临时数组,因为参3(参4)直接是不断变化的,这里只是模拟变化 char tmp1[50] = { 0 }; sprintf_s(tmp1, "%s_%d", camera_uid.c_str(), i); //先往对象插入数据 Value v1(tmp1, a); Value v2(message.c
  • 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) { /*
  • 从外部 URL 获取 JSON 数组中的数据(Get data out of JSON array from external URL)
    问题 我对 JSON 比较陌生。 我已经阅读了教程并尝试实现它,但没有运气。 基本上我有一个提供 JSON 数据/提要的外部 URL。 数据是数组的形式。 现在我正在尝试编写一个 JavaScript 程序(在我的本地),它将从此 URL 中获取数据并放入我的 html 中。 这是功能。 它还包括外部链接。 但我没有得到任何结果。 只是空的。 我是否遗漏了什么或我做错了什么? <!doctype html> <html> <head> <meta charset="utf-8"> <title>Index Page</title> </head> <body> <div id="id01"></div> <script> var xmlhttp = new XMLHttpRequest(); var url = "http://mpatrizio-001-site5.smarterasp.net/categoryList.php?D=B7ACEF70-4901-41C8-930F-D4D681D82DAA"; xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { var myArr = JSON.parse(xmlhttp
  • 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
  • 我如何以与 jQuery 相同的方式获取 fetch() 来发布数据?(How do I get fetch() to POST data the same way as jQuery does?)
    问题 我正在尝试从某些代码中删除 jQuery。 我只将它用于 POST 操作,所以我想删除它并使用 fetch() 代替。 但是我无法使用相同的数据让 fetch() 工作。 php 文件工作正常,只是没有接收到数据 这为以下两个测试用例设置了测试数据: var toPostObj = new(Object); toPostObj.action = "update+file"; toPostObj.arrays = [["2020-12-28", "23:20:56", "Trying from ztest", "9.jpg"]]; 这适用于 jQuery: $.post('toMariaDB.php', { // url data: toPostObj }, function(data2, status, jqXHR) { console.log ("data2",data2); }); 这不适用于 fetch(): fetch("toMariaDB.php", { method: "POST", body: toPostObj, // using JSON.stringify(toPostObj) also doesn't work headers: { "Content-type": "application/text; charset=UTF-8" } }) .then
  • c#正则表达式? 来自文件的文本字符串并排序到可搜索数组中?(c# regex? text string from file and sort into searchable array?)
    问题 我有一个文件中的以下文本: {"players":[{"i":11,"p":0,"a":3186,"n":"IanHx","f":1,"ps":0,"pd":0,"bc":0},{"i":12,"p":0,"a":115,"n":"LoZtamnik","f":1,"ps":0,"pd":0,"bc":0},{"i":58,"p":0,"a":156,"n":"Mr701","f":2,"ps":0,"pd":0,"bc":0},{"i":59,"p":0,"a":156,"n":"B0NE4","f":2,"ps":0,"pd":0,"bc":0},{"i":64,"p":0,"a":324,"n":"5teveJ","f":1,"ps":0,"pd":0,"bc":0}],[....... 我想要做的是解析文本,最终得到一个数组,用于 {...} 之间的每一位数据 所以最终结果看起来像: i=11 p=0 a=3186 n=IanHx f=1 ps=0 pd=0 bc=0 然后我可以将这些存储在数据库中 到目前为止,我有这样的事情: string contents = System.IO.File.ReadAllText("local text file"); //load string contents with text file Regex regex1 = new
  • jQuery从JSON数组获取数据(JQuery get data from JSON array)
    问题 这是我从foursquare获得的JSON的一部分。 JSON格式 tips: { count: 2, groups: [ { type: "others", name: "Tips from others", count: 2, items: [ { id: "4e53cf1e7d8b8e9188e20f00", createdAt: 1314115358, text: "najjači fitness centar u gradu", canonicalUrl: "https://foursquare.com/item/4e53cf1e7d8b8e9188e20f00", likes: { count: 2, groups: [ { type: "others", count: 2, items: [] }], summary: "2 likes" }, like: false, logView: true, todo: { count: 0 }, user: { id: "12855147", firstName: "Damir", lastName: "P.", gender: "male", photo: { prefix: "https://irs1.4sqi.net/img/user/", suffix: "/AYJWDN42LMGGD2QE.jpg" } }
  • 有没有一种内存高效且快速的方法来在python中加载大json文件?(Is there a memory efficient and fast way to load big json files in python?)
    问题 我有一些500MB的json文件。 如果我使用“平凡”的json.load一次加载所有内容,它将消耗大量内存。 有没有办法部分读取文件? 如果它是文本行分隔文件,则可以在行上进行迭代。 我正在寻找一个比喻。 有什么建议? 谢谢 回答1 更新 请参阅其他答案以获取建议。 2010年的原始答案,现在已经过时 简短的回答:不。 正确分割json文件将需要对json对象图有深入的了解。 但是,如果您具有这些知识,则可以实现一个类似文件的对象,该对象包装json文件并吐出适当的块。 例如,如果您知道json文件是单个对象数组,则可以创建一个包装json文件并返回数组块的生成器。 您将必须进行一些字符串内容解析,以正确获取json文件的分块。 我不知道是什么产生了您的json内容。 如果可能的话,我会考虑生成多个可管理文件,而不是一个大文件。 回答2 这个问题有一个重复的答案更好。 请参阅https://stackoverflow.com/a/10382359/1623645,其中建议使用ijson。 更新: 我尝试了一下,而ijson是JSON,而SAX是XML。 例如,您可以执行以下操作: import ijson for prefix, the_type, value in ijson.parse(open(json_file_name)): print prefix, the
  • Unity3d - C# - 如何备份数组的值?(Unity3d - C# - How can I back up of values of an array?)
    问题 我在脚本 (C#) 中定义了一个包含 67 个元素的数组。 每个元素都是我定义的包含一些变量的类的对象。 如下图: // the Definition of the array public Pack[] packsInfo; // the class [Serializable] public class Pack { public int number; public int angle; public float zPosition; public float beatCaseDistance; public float gunDistance; } 然后,我在 Inspector 中分​​配所有值。 像下面: 所以...如果我突然更改任何值或更糟,(值因任何原因消失。比如更改类参数或任何事情)那么我必须花几个小时来设置所有值。 所以我想打印文本或文件中的所有值并保存它们。 以便稍后恢复它们。 我想要一个备份解决方案。我想用编程来做。 (我不想手动编写它们;)。这是浪费时间。 ) 回答1 要保存您的数组,您可以使用例如 JsonUtillity。 很简单! 祝你好运! void Start () { /////////////////////// save to json JSONObject jsonSave = new JSONObject(); for(int i
  • 使用带有多个元素/数组/子数组的boost / property_tree从json文件中获取值(Getting values from a json file using boost/property_tree, with multiple elements/arrays/sub-arrays C++)
    问题 事实: 我正在使用VS2013并在C ++中进行开发。 我正在使用Boost API从标准/合法json文件中获取值。 我无法提取name4.js , name5.js和name6.js名称。 我在stackoverflow / Google上进行了全面搜索,但没有找到我正在使用的以下json文件的任何解释。 json文件: { "background": { "scripts": [ "name1.js", "name2.js", "name3.js" ] }, "default_popup": "popup.html", "default_title": "__MSG_name__", "content_scripts": [ { "all_frames": true, "js": [ "name4.js", "name5.js", "name6.js" ], "match_about_blank": true, "matches": [ "http://*/*", "https://*/*" ], "run_at": "document_start" }, { "all_frames": true, "js": [ "include.postload.js" ], "match_about_blank": true, "matches": [ "http://*/*"
  • 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++ Boost库:使用property_tree解析XML和JSON
    文章目录 1. C++中解析XML文件2. property_tree库简介3. property_tree 解析XML示例代码4. C++中解析JSON文件5. property_tree 解析JSON示例代码 C++ Boost库:简介和第一个示例程序 C++ Boost库:数值转换 lexical_cast C++ Boost库:字符串格式化 format C++ Boost库:字符串string_algo C++ Boost库:字符串算法string_algo C++ Boost库:类型推导BOOST_AUTO/BOOST_TYPEOF C++ Boost库:分词处理库 tokenizer C++ Boost库:windows下编译Boost库 C++ Boost库:日期时间库 date_time C++ Boost库:智能指针scoped_ptr C++ Boost库:数组智能指针 scoped_array C++ Boost库:共享所有权的智能指针 shared_ptr C++ Boost库:工厂函数 make_shared C++ Boost库:共享有权的数组智能指针shared_array C++ Boost库:弱引用智能指针 weak_ptr C++ Boost库:禁止拷贝 nocopyable C++ Boost库:计时器 timer C++ Boost库
  • python自动化(五)接口自动化:2.接口测试requests模块
    一.requests介绍 requests模块是python的第三方库,使用它我们可以非常方便的发起get,post等接口请求。并且获取接口的返回值。在自动化中我们常常使用requests模块来编写接口自动化测试用例。 requests的官方文档为:https://docs.python-requests.org/zh_CN/latest/ 二.requests详解 1.安装 pip install requests 2.常用API 2.1发送请求相关的API (1) 发送get请求API requests.get('https://github.com/ouyi-github/') # 不带参数 requests.get(url='http://dict.baidu.com/s', params={'wd':'python','from':'zici'}) # 带参数。方式1 requests.get(url='https://dict.baidu.com/s?wd=python&from=zici') # 带参数。方式2 (2)发送post请求API r = requests.post('http://httpbin.org/post', data = {'key':'value'}) #以form表单形式提交数据 r = requests.post('https://api
  • 从 JSON 对象中的字节数组获取图像到 android 应用程序(getting image from byte array in JSON object to android app)
    问题 这是我的情况: 我有一个 RESTful WCF 服务在我的服务器上运行,该服务旨在从数据库中获取有关人员的各种类型的数据,并将该数据作为单个 JSON 对象提供。 效果很好! [编辑] 还有另一个服务在服务器的文件系统中维护图像缓存。 当请求发送到 RESTful 服务时,该服务随后会从影像服务请求影像。 如果图像已经在缓存中(与请求的宽度、高度和人物相同),它会返回(作为字节数组)。 我们必须使用此服务来检索图像。 现在我想要的是那个人的形象。 在我们的数据库中,图像是长原始图像 (ew)。 但是,我已经处理过这个问题(上一段)。 图像现在是一个字节数组。 我对 android 还很陌生,我不确定检索此图像的最佳方法是什么。 我认为我可以做的是将字节数组添加到 JSON 对象,然后使用 base64 解码器将其转换为可绘制的图像。 但是,每次我尝试时,它都会超时并告诉我它期望在 JSON 对象的 char 缓冲区的某个任意索引处出现 ',' 或 ']' 。 我已经能够毫无问题地从 JSON 对象中提取少量数据,但是现在其中有一个巨大的字节数组,JSONObject 讨厌我。 从我的服务中获取此图像的更好方法是什么? 回答1 Base64 编码字节数组以获取字符串。 将字符串添加到 JSON 对象并发送。 收到 JSON 后,取出字符串。 Base64