天道酬勤,学无止境

使用 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);

    std::cout << sb["innerNestedItem1"].GetString();
    std::cout << sb["innerNestedItem2"].GetString();
}

但是 [] 不允许与 sb(string buffer) 一起使用,知道我该怎么做吗?

Edit1:我以非常低效的方式做到了,但只是分享了解决方案,因此它可能会帮助某人提出有效的解决方案。

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);

    //changed from here onwards
    rapidjson::Document for_outer_nested_item;
    std::string temp = sb.GetString();
    char buffer2[100000];
    strcpy_s(buffer2, temp.c_str());
    for_outer_nested_item.ParseInsitu(buffer2);
    std::cout << executive_command["innerNestedItem1"].GetString() << std::endl;
    std::cout << executive_command["innerNestedItem2"].GetString() << std::endl;
}
回答1

首先,让我在此链接上感谢 MiloYip

其次——这是我为我的项目所做的:

rapidjson::Document document;
// document holds a json document retrieved from a http GET request
// I did not include all of that in this example.  I am only showing
// the part of iterating through a nested object and retrieving members.

std::vector<std::string> symbols;
// holds the values I retrieve from the json document

if (document.Parse<0>( symbol.c_str() ).HasParseError() )
    Log() << "ERROR: encountered a JSON parsing error" << std::endl;
else {
    // Get the nested object that contains the elements I want.
    // In my case, the nested object in my json document was results
    // and the values I was after were identified as "t"
    rapidjson::Value& results = document["results"];
    assert(results.IsArray());
    for (rapidjson::SizeType i = 0; i < results.Size(); i++) {
        // Store the value of the element in a vector.
        symbols.emplace_back(results[i]["t"].GetString());
}                            

我认为这是一种非常干净/有效的方法。

回答2

这是我最近在做的事情:

void enter(const Value &obj, size_t indent = 0) { //print JSON tree

if (obj.IsObject()) { //check if object
    for (Value::ConstMemberIterator itr = obj.MemberBegin(); itr != obj.MemberEnd(); ++itr) {   //iterate through object   
        const Value& objName = obj[itr->name.GetString()]; //make object value

        for (size_t i = 0; i != indent; ++i) //indent
            cout << " ";

        cout << itr->name.GetString() << ": "; //key name

        if (itr->value.IsNumber()) //if integer
            std::cout << itr->value.GetInt() ;

        else if (itr->value.IsString()) //if string
            std::cout << itr->value.GetString();


        else if (itr->value.IsBool()) //if bool
            std::cout << itr->value.GetBool();

        else if (itr->value.IsArray()){ //if array

            for (SizeType i = 0; i < itr->value.Size(); i++) {
                if (itr->value[i].IsNumber()) //if array value integer
                    std::cout << itr->value[i].GetInt() ;

                else if (itr->value[i].IsString()) //if array value string
                    std::cout << itr->value[i].GetString() ;

                else if (itr->value[i].IsBool()) //if array value bool
                    std::cout << itr->value[i].GetBool() ;

                else if (itr->value[i].IsObject()){ //if array value object
                    cout << "\n  ";
                    const Value& m = itr->value[i]; 
                    for (auto& v : m.GetObject()) { //iterate through array object
                        if (m[v.name.GetString()].IsString()) //if array object value is string
                            cout << v.name.GetString() << ": " <<   m[v.name.GetString()].GetString();
                        else //if array object value is integer
                            cout << v.name.GetString() << ": "  <<  m[v.name.GetString()].GetInt();

                       cout <<  "\t"; //indent
                    }
                }
                cout <<  "\t"; //indent
            }
        }

        cout << endl; 
        enter(objName, indent + 1); //if couldn't find in object, enter object and repeat process recursively 
        }     
 }
 }

这可以处理任何类型的 JSON 树。 您所要做的就是传递一个值:

Value v = document.GetObject();
Value& m= v;
enter(m);

你完成了!

回答3
void parseRecursive(std::string scope
                    , rapidjson::Value::ConstMemberIterator object
                    , std::unordered_map<std::string, std::string>& values)
{
    if (scope.empty())
    {
        scope = object->name.GetString();
    }
    else
    {
        scope = scope + "::" + object->name.GetString();
    }
    auto inElement = scope + "::";

    if (object->value.IsObject())
    {
        for (auto it = object->value.MemberBegin(); it != object->value.MemberEnd(); ++it)
        {
            parseRecursive(scope, it, values);
        }
    }
    else if (object->value.IsDouble())
    {
        values.emplace(inElement, std::to_string(object->value.GetDouble()));
    }
    else if (object->value.IsInt())
    {
        values.emplace(inElement, std::to_string(object->value.GetInt()));
    }
    else
    {
        LOGW("Unsuported: " << inElement << object->name.GetString());
    }
}

并从文档开始: rapidjson::Document document;

for (auto it = document.MemberBegin(); it != document.MemberEnd(); ++it)
{
    parseRecursive("", it, _values);
}
回答4

a.raya203的帖子 https://stackoverflow.com/a/43120359/6155053 对我来说开箱即用(不处理当前 Rapidjson 版本实现的所有类型,因此在例如输出时遇到错误gltfs 包含双打等)但它让我了解了rapidjson 如何解析文档,所以我想我会把我的(更新的)代码留在这里,也许它可以帮助其他人......

#include <iostream>
#include <string>

class JsonNodePrinter final
{
public: 
    static void PrintNode(const rapidjson::Value &node, size_t indent = 0, unsigned int level = 0, const std::string& nodeName = "")
    {
        std::cout << GetIndentString(indent, level);

        if (!nodeName.empty())
            std::cout << nodeName << ": ";

        if (node.IsBool())
            std::cout << node.GetBool();

        else if (node.IsInt())
            std::cout << node.GetInt();

        else if (node.IsUint())
            std::cout << node.GetUint();

        else if (node.IsInt64())
            std::cout << node.GetInt64();

        else if (node.IsUint64())
            std::cout << node.GetUint64();

        else if (node.IsDouble())
            std::cout << node.GetDouble();

        else if (node.IsString())
            std::cout << node.GetString();

        else if (node.IsArray())
        {
            if (!nodeName.empty()) std::cout << "\n" << GetIndentString(indent, level);
            PrintArray(node, indent, level);
        }

        else if (node.IsObject())
        {
            if (!nodeName.empty()) std::cout << "\n" << GetIndentString(indent, level);
            PrintObject(node, indent, level);
        }

        std::cout << "\n";
    }

    static void PrintObject(const rapidjson::Value &node, size_t indent = 0, unsigned int level = 0)
    {
        std::cout << "{\n";

        for (rapidjson::Value::ConstMemberIterator childNode = node.MemberBegin(); childNode != node.MemberEnd(); ++childNode)
        {
            PrintNode(childNode->value, indent, level + 1, childNode->name.GetString());
        }

        std::cout << GetIndentString(indent, level) << "}";
    }

    static void PrintArray(const rapidjson::Value& node, size_t indent = 0, unsigned int level = 0)
    {
        std::cout << "[\n";

        for (rapidjson::SizeType i = 0; i < node.Size(); ++i)
        {
            PrintNode(node[i], indent, level + 1);
        }

        std::cout << GetIndentString(indent, level) << "]";
    }

    static std::string GetIndentString(size_t indent = 0, unsigned int level = 0)
    {
        return std::move(std::string(level * indent, ' '));
    }
};

使用它就像

#include "3rdParty/rapidjson/document.h"

rapidjson::Document document;
{
    document.Parse(FileHelper::ReadString(filePath)->c_str());
}

if (!document.HasParseError())
{
    JsonNodePrinter::PrintNode(document, 4);
}
回答5

我最近也在想同样的事情,这是我得到的:

#include "rapidjson\filereadstream.h"
#include "rapidjson\document.h"
#include "rapidjson\istreamwrapper.h"
#include <fstream>
#include <iostream>

using namespace rapidjson;

// Documentation : using file stream instead of C FILE pointers
// http://rapidjson.org/md_doc_stream.html#FileStreams
ifstream file_stream(filepath);
IStreamWrapper isw(file_stream);

Document doc;
doc.ParseStream(isw);
file_stream.close();

if(doc.HasMember(CONF_NODE)){
Value *config_node = &(doc[CONF_NODE]);
// Now I can use it like so:
std::cout << (*config_node)["My Other Json node"].GetString() << std::endl;
}

我多次使用这个技巧来避免使用无限长的访问请求,例如

 doc["Node1"]["Node2"]["Node3"]...["NodeX"].GetType()
而是依靠可用于虚拟“拆分”文档链的指针:
doc["Node1"]["Node2"]["Node3"]...["NodeX"].GetType()
                     |            |
                 pointer1         |
                                  pointer2
(*pointer_on_Node_N)["Node N+1"] = doc["Node1"][...]["NodeN"]["Node N+1]

当我需要遍历我的文件时(面对数组时),这特别方便。

标签

受限制的 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对象中检索值(Retrieving values from nested JSON Object)
    问题 我有要解析的JSON文件。 JSON文件(“ myfile”)的格式如下: { "LanguageLevels": { "1": "Początkujący", "2": "ŚrednioZaawansowany", "3": "Zaawansowany", "4": "Ekspert" } } 我想从语言级别检索键2的值(ŚrednioZaawansowany)。 import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.Iterator; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; public class JsonSimpleExample { public static void main(String[] args) { JSONParser parser = new JSONParser(); try { Object obj =
  • Rapidjson提取键和值(rapidjson extract key and value)
    问题 我正在尝试提取数组中对象的键和值,但找不到合适的吸气剂: for (Value::ConstValueIterator itr = document["params"].Begin(); itr != document["params"].End(); ++itr) { for (Value::MemberIterator m = itr->MemberBegin(); m != itr->.MemberEnd(); ++m) { } } 在第二个循环中,我想分别从迭代器中提取键和值。 怎么做提取? 回答1 假设V是一个具有键值对象的JSON对象。 您可以像这样检索数据。 const rapidjson::Value& V; for (Value::ConstMemberIterator iter = V.MemberBegin(); iter != V.MemberEnd(); ++iter){ printf("%s\t", iter->name.GetString()); printf("%s\t", iter->value.GetString()); } 回答2 m是Member* ,其中Member是 struct Member { GenericValue<Encoding, Allocator> name; //!< name of member (must be
  • 遍历PowerShell中的PSObject属性(Iterate over PSObject properties in PowerShell)
    问题 我有这个PSObject (来自XML): bool : {IsActive, ShowOnB2C, ShowOnB2B, IsWebNews} str : {id, ProductId, GroupName, Unit...} int : {ProductIdNumeric, Prices_SalesOne, Prices_Treater, Prices_B2C...} arr : {EnvironmentBrands, Catalogs, NavisionLevels} long : long 我想在不使用属性名称的情况下迭代属性,例如bool 。 我试图索引到这样的对象: $document[0] 但这并没有给我任何好处,但也不会引起任何错误。 Select-Object的工作方式,但然后我必须使用属性名称,并且我不想要那样。 $documents | Select-Object bool,str ForEach不迭代属性。 $documents | ForEach { $_.name } 返回doc,它是保存布尔值,整数和字符串的标记(XML)的名称。 回答1 使用隐藏属性PSObject可以实现: $documents.PSObject.Properties | ForEach-Object { $_.Name $_.Value } 回答2
  • 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
  • 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()
  • 在java中检索嵌套json中的所有键(Retrieving all the keys in a nested json in java)
    问题 这是我写的程序: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package javaapplication1; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.StringTokenizer; import net.sf.json.JSONException; import net.sf.json.JSONObject; /** * * @author 311001 */ public class NewClass { public static void main(String args[]) { JSONObject parentData = new JSONObject(); JSONObject childData = new JSONObject(); try { parentData.put("command", "login"); parentData.put("uid", "123123123"); childData
  • 带有ne04j错误的Spring数据......检索路径时出错(Spring data wth ne04j error…error while retrieving paths)
    问题 我在neo4j中使用spring数据。 我使用@Query注解将查询放入repository中,查询如下 @Query(value = "START me=node({0}), friend=node({1}) " + "MATCH p=shortestPath(me-[:ACTIVEFRIEND*..]->friend)" + " RETURN p") public Iterable<EntityPath<User, User>> getShortestPathBetween(User a, User b); 在控制器中我访问它 Iterable<EntityPath<User, User>> shortestPathBetween = this.queryService.getShortestPathBetween(user, friend); for (EntityPath<User, User> path : shortestPathBetween) { Iterator<User> iter = path.<User>nodeEntities().iterator(); } 当它尝试访问path.nodeEntities ,会导致此错误: 嵌套异常是 java.lang.NullPointerException] 具有根本原因 java.lang
  • 将嵌套的JSON数组转换为CSV文件中的单独列(Convert nested JSON array into separate columns in CSV file)
    问题 我有一个看起来像这样的JSON文件: { "id": 10011, "title": "Test procedure", "slug": "slug", "url": "http://test.test", "email": "test@test.com", "link": "http://test.er", "subject": "testing", "level": 1, "disciplines": [ "discipline_a", "discipline_b", "discipline_c" ], "areas": [ "area_a", "area_b" ] }, 我试图使用以下命令将其转换为CSV文件: (Get-Content "PATH_TO\test.json" -Raw | ConvertFrom-Json)| Convertto-CSV -NoTypeInformation | Set-Content "PATH_TO\test.csv" 但是,对于学科和领域,我在生成的CSV文件中获取System.Object []。 有没有一种方法可以将所有这些嵌套值作为单独的列放在CSV文件中,例如area_1,area_2等。对于学科也是如此。 回答1 CSV转换/导出cmdlet无法“展平”对象,并且我可能丢失了一些东西
  • 如何使用“ json”模块一次读取一个JSON对象?(How do I use the 'json' module to read in one JSON object at a time?)
    问题 我有一个千兆字节的JSON文件。 该文件由每个不超过几千个字符的JSON对象组成,但是记录之间没有换行符。 使用Python 3和json模块,如何一次从文件读取一个JSON对象到内存? 数据在纯文本文件中。 这是类似记录的示例。 实际记录包含许多嵌套的字典和列表。 以可读格式记录: { "results": { "__metadata": { "type": "DataServiceProviderDemo.Address" }, "Street": "NE 228th", "City": "Sammamish", "State": "WA", "ZipCode": "98074", "Country": "USA" } } } 实际格式。 新记录一个接一个地开始,没有任何中断。 {"results": { "__metadata": {"type": "DataServiceProviderDemo.Address"},"Street": "NE 228th","City": "Sammamish","State": "WA","ZipCode": "98074","Country": "USA" } } }{"results": { "__metadata": {"type": "DataServiceProviderDemo.Address"},"Street":
  • MongoDB中的JavaScript NoSQL注入预防(JavaScript NoSQL Injection prevention in MongoDB)
    问题 如何防止将JavaScript NoSQL注入MongoDB? 我正在开发一个Node.js应用程序,并将一个json对象req.body传递到了猫鼬模型的save函数中。 我以为幕后有保障措施,但事实并非如此。 回答1 注意我的答案不正确。 请参考其他答案。 -- 客户端程序在MongoDB中组装查询时,将构建BSON对象而不是字符串。 因此,传统的SQL注入攻击不是问题。 有关详细信息,请遵循文档 更新 避免像eval这样的表达式可以执行任意JS。 如果您从用户那里获取输入并运行类似eval表达式而不清除输入,则可能会搞砸。 如JoBu1324所指出的,诸如where , mapReduce和group允许直接执行JS表达式。 回答2 Sushant的答案不正确。 您需要了解MongoDB中的NoSQL注入。 示例(从此处获取) User.findOne({ "name" : req.params.name, "password" : req.params.password }, callback); 如果req.params.password为{ $ne: 1 } ,则将在不知道密码的情况下检索用户( $ne表示不等于1 )。 MongoDB驱动程序 您可以使用mongo-sanitize: 它将去除输入中以“ $”开头的所有键,因此您可以将其传递给MongoDB
  • 将ES6可迭代转换为数组(Convert ES6 Iterable to Array)
    问题 假设您有一个类似数组的Javascript ES6 Iterable,您事先知道它的长度是有限的,那么将其转换为Javascript数组的最佳方法是什么? 这样做的原因是,许多下划线和lodash之类的js库仅支持Arrays,因此,如果您希望在Iterable上使用其任何功能,则必须首先将其转换为Array。 在python中,您可以只使用list()函数。 ES6是否有等效功能? 回答1 您可以使用Array.from或散布运算符。 例子: let x = new Set([ 1, 2, 3, 4 ]); let y = Array.from(x); console.log(y); // = [ 1, 2, 3, 4 ] let z = [ ...x ]; console.log(z); // = [ 1, 2, 3, 4 ] 回答2 概括: Array.from()函数,它接受输入中的iterable并返回该iterable的数组。 Spread运算符: ...与数组文字组合。 const map = new Map([[ 1, 'one' ],[ 2, 'two' ]]); const newArr1 = [ ...map ]; // create an Array literal and use the spread syntax on it const
  • python学习笔记(十)——迭代器和生成器(外加import功能)
    迭代器 百科:迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。 迭代器定义: 所谓迭代器就是具有next方法的对象,在调用next方法时,迭代器会返回它的下一个值。如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常。 迭代器书写格式: 从可迭代对象生成一个迭代器 迭代器=iter(可迭代对象) 下个值=next(迭代器) 示例: li = [1,2,3,4,5,6] a = iter(li) print(a) print(next(a)) # 单次取一个 执行结果:1 注意:next()只能用一次;如果用循环取,不用管下标,只能依次取值,取完之后会抛出异常,迭代完毕(next(a) == a.next()) 示例: li = [1,2,3] itr = iter(li) try: while True: b = next(itr) print(b) except StopIteration: print('error!!!') 执行结果: 1 2 3 error!!! for和while也都可以实现迭代过程,比如: for i in range(100): # 依次拿东西 这就是迭代的过程 print(i) ===================
  • 如何通过其值获取JavaScript对象中的键?(How to get a key in a JavaScript object by its value?)
    问题 我有一个非常简单的JavaScript对象,用作关联数组。 是否有一个简单的函数可以让我获取值的键,还是必须迭代该对象并手动找到它? 回答1 function getKeyByValue(object, value) { return Object.keys(object).find(key => object[key] === value); } ES6,没有原型突变或外部库。 例子, function getKeyByValue(object, value) { return Object.keys(object).find(key => object[key] === value); } const map = {"first" : "1", "second" : "2"}; console.log(getKeyByValue(map,"2")); 回答2 没有可用的标准方法。 您需要进行迭代,然后可以创建一个简单的帮助程序: Object.prototype.getKeyByValue = function( value ) { for( var prop in this ) { if( this.hasOwnProperty( prop ) ) { if( this[ prop ] === value ) return prop; } } } var test =
  • 在HTML5数据属性中存储和检索JavaScript数组(store and retrieve javascript arrays into and from HTML5 data attributes)
    问题 如何将javascript Array存储在HTML5 data属性中? 我已经尝试了JSON.stringify阳离子和转义字符的所有变体。 存储数组并再次检索它的精确方法是什么? 笔记 我用[ $("#firstSelectedElement").val(), $("#secondSelectedElement").val() ]构建数组。 我用$("#storageElement").data('storeit')检索id="storageElement" data-storeIt="stuff" 。 我似乎永远都无法将数据作为一个真正的Array来检索,而只能是一个字符Array 。 回答1 原来,您可以在element data属性中使用html转义字符来具有类似json的数组(编码为引号): <div id="demo" data-stuff='["some", "string", "here"]'></div> 然后在javascript中获得它,而无需任何其他魔术: var ar = $('#demo').data('stuff'); 检查这个小提琴。 编辑(2017) 您无需在data属性中使用html转义字符。 <div id="demo" data-stuff='["some", "string", "here"]'></div> 检查这个新的小提琴。
  • 通过嵌套json为python中的特定键进行递归迭代(recursive iteration through nested json for specific key in python)
    问题 我正在尝试从json文件中提取嵌套值。 我想打印出每个“ id”键的每个值。 我想我已经接近了,但无法弄清楚为什么obj类型从字典更改为列表,然后为什么我无法解析该列表。 这是我正在使用的json的链接:http://hastebin.com/ratevimixa.tex 这是我当前的代码: #!/usr/bin/env python #-*- coding: utf-8 -*- import json json_data = open('JubJubProductions.json', 'r+') jdata = json.loads(json_data.read().decode("utf-8")) def recursion(dict): for key, value in dict.items(): if type(value) == type(dict): if key != "paging": for key, value in value.items(): if isinstance (value,list): print key # place where I need to enter list comprehension? if type(value) == type(dict): if key == "id": print " id found " +
  • 检索Multimap中的特定值(Retrieving specific values in Multimap)
    问题 我正在使用一个每个键有两个值的Multimap。 下面是我用来分别获取每个值的代码: 代码的第一位获取第一个对象值: for(Object object : map.get(object)) { return object } 然后,我正在使用另一种方法来检索其他值。 此方法将第一个对象作为参数: for(Object object : team.get(object)) { if(object != initialObject) { return object; } } 这似乎是一种“骇人听闻的”做事方式,那么我有什么办法可以更轻松地获得价值呢? 回答1 Collection<Object> values = map.get(key); checkState(values.size() == 2, String.format("Found %d values for key %s", values.size(), key)); return values.iterator().next(); // to get the first Iterator<Object> it = values.iterator(); it.next(); // move the pointer to the second object return it.next(); // get the
  • C++ RapidJson解析
    #include <rapidjson/rapidjson.h> #include <rapidjson/writer.h> #include <rapidjson/prettywriter.h> #include <rapidjson/document.h> #include <rapidjson/stringbuffer.h> #include <rapidjson/memorystream.h> #include <map> #ifdef __unix #endif using namespace std; using rapidjson::Document; using rapidjson::StringBuffer; using rapidjson::Reader; using rapidjson::Writer; using namespace rapidjson; bool parseJSON_string_double(string jsonstr, map<string, double>& ffea) { Document root; if (root.Parse(jsonstr.c_str()).HasParseError()) { // c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同. Parse(
  • jQuery-迭代JSON响应(JQuery - Iterating JSON Response)
    问题 到目前为止的故事... 试图学习JS和JQuery,我想我会从基础开始,尝试各种AJAX “键入时搜索”魔术。 首先,我只是想正确地使用AJAX部分,并遍历返回的JSON对象并将其附加到无序列表中。 我目前不对输入值与返回的JSON结果进行任何验证,我只想知道何时进行AJAX getJSON调用的受控方式。 稍后,一旦我理解正确,我将进行验证。 无论如何我无法在ul中显示帐号。 目前,唯一显示的是li中的AccountNumber ,而不是我的ACCOUNT NUMBERS 我的JS代码在这里: http://jsfiddle.net/garfbradaz/HBYvq/54/ 但为了方便起见,在这里: $(document).ready(function() { $("#livesearchinput").keydown(function(key) { $.ajaxSetup({ cache: false }); $.getJSON(" /gh/get/response.json//garfbradaz/MvcLiveSearch/tree/master/JSFiddleAjaxReponses/", function(JSONData) { $('<ul>').attr({ id: "live-list" }).appendTo('div#livesearchesults'
  • 如何定义类似于Vector的Vector的Double Brackets / Double Iterator运算符?(How Do I define a Double Brackets/Double Iterator Operator, Similar to Vector of Vectors'?)
    问题 我正在移植使用大量浮点数的代码,这可能会导致malloc从c到c ++的失败。 我问了一个有关应该使用向量还是双端队列的问题,Niki Yoshiuchi慷慨地为我提供了一个安全包装类型的示例: template<typename T> class VectorDeque { private: enum TYPE { NONE, DEQUE, VECTOR }; std::deque<T> m_d; std::vector<T> m_v; TYPE m_type; ... public: void resize(size_t n) { switch(m_type) { case NONE: try { m_v.resize(n); m_type = VECTOR; } catch(std::bad_alloc &ba) { m_d.resize(n); m_type = DEQUE; } break; } } }; 我需要2D向量的向量/双端队列,因此我将其修改为以下代码: template<typename T> class VectorDeque { private: enum STORAGE_CONTAINER { NONE, DEQUE, VECTOR }; std::deque<std::deque<T> > x_d,y_d,z_d; std::vector<std
  • python序列化原理与格式转换
    引言 本篇想从序列化开始,讲述python的xml、json以及protobuf文件格式,并实现xml到json以及json到protobuf之间格式的互转与xml增删改查操作。另外关于ujson与bjson等格式类型,会在最后进行总结。 序列化与反序列化 互联网的产生带来了机器间通讯的需求,而互联通讯的双方需要采用约定的协议,序列化和反序列化属于通讯协议的一部分。通讯协议往往采用分层模型,不同模型每层的功能定义以及颗粒度不同,例如:TCP/IP协议是一个四层协议,而OSI模型却是七层协议模型。在OSI七层协议模型中展现层(Presentation Layer)的主要功能是把应用层的对象转换成一段连续的二进制串,或者反过来,把二进制串转换成应用层的对象–这两个功能就是序列化和反序列化。一般而言,TCP/IP协议的应用层对应与OSI七层协议模型的应用层,展示层和会话层,所以序列化协议属于TCP/IP协议应用层的一部分。本文对序列化协议的讲解主要基于OSI七层协议模型。 上一段引用自美团2015年的 序列化和反序列化 . 不知道为啥看的人很少,但我觉得这篇文章概念都介绍得挺深的,我看得也受益匪浅,所以本篇的很多概念都会出自于这篇和几篇外文文献,我会在最后的参考文献里标注出来。那么经过上面这一段话,我们就能总结出序列化和反序列化的原理: 序列化: