2017-04-10 183 views
3

我在使用boost库,C++中的属性树创建json数组时遇到了麻烦。使用boost创建json数组property_tree

我把作为参考this线程,尤其是这部分

ptree pt; 
ptree children; 
ptree child1, child2, child3; 


child1.put("childkeyA", 1); 
child1.put("childkeyB", 2); 

child2.put("childkeyA", 3); 
child2.put("childkeyB", 4); 

child3.put("childkeyA", 5); 
child3.put("childkeyB", 6); 

children.push_back(std::make_pair("", child1)); 
children.push_back(std::make_pair("", child2)); 
children.push_back(std::make_pair("", child3)); 

pt.put("testkey", "testvalue"); 
pt.add_child("MyArray", children); 

write_json("test2.json", pt); 

结果:

{ 
    "testkey": "testvalue", 
    "MyArray": 
    [ 
     { 
      "childkeyA": "1", 
      "childkeyB": "2" 
     }, 
     { 
      "childkeyA": "3", 
      "childkeyB": "4" 
     }, 
     { 
      "childkeyA": "5", 
      "childkeyB": "6" 
     } 
    ] 
} 

但我能做些什么,如果我想实现只是简单的阵列不含任何对象?像这样:

[ 
    { 
     "childkeyA": "1", 
     "childkeyB": "2" 
    }, 
    { 
     "childkeyA": "3", 
     "childkeyB": "4" 
    }, 
    { 
     "childkeyA": "5", 
     "childkeyB": "6" 
    } 
] 

非常感谢。支持JSON

+0

如果你使用'pt.add_child( “”,孩子们)会发生什么;'? – NathanOliver

+0

应用程序崩溃,因为它试图将孩子添加到空白部分,不幸的是.. 类似'pt.add_child(NULL,children);' –

回答

1

最后,我还没有找到解决方案使用Boost库。 但是,这可以通过使用cpprestsdk(“卡萨布兰卡”)来实现。

例子:

using namespace web; 
using namespace web::http; 
using namespace web::http::client; 
using namespace web::json; 

void testFunction(http_request req) 
{ 

    // only to test the serialization of json arrays 
    json::value elmnt1; 
    elmnt1[L"element"] = json::value::string(U("value1")); 

    json::value elmnt2; 
    elmnt2[L"element"] = json::value::string(U("value2")); 

    json::value response;      // the json array 
    response[0] = elmnt1; 
    response[1] = elmnt2; 

    string outputStr = utility::conversions::to_utf8string(shifts.serialize()); 

    req.reply(200, outputStr, "application/json"); 
}; 

,这导致

[ 
    { 
    "element":"value1" 
    }, 
    { 
    "element":"value2" 
    } 
] 
2

Boost文档是只有几行:

http://www.boost.org/doc/libs/1_63_0/doc/html/property_tree/parsers.html#property_tree.parsers.json_parser

属性树集不会打字,和不支持数组作为 这样。因此,使用以下JSON /属性树映射:

  • JSON对象映射到节点。每个属性都是一个子节点。
  • JSON数组映射到节点。每个元素是一个 空名称的子节点。如果一个节点同时具有已命名和未命名的子节点,则不能将其映射到JSON表示。
  • JSON值映射到包含该值的节点。但是,所有类型的 信息都会丢失;数字以及文字“null”,“true”和 “false”都简单地映射到它们的字符串形式。
  • 包含子节点 和数据的属性树节点无法映射。

JSON往返,除了类型信息丢失。

突出矿井