![](/img/trans.png)
[英]How to append an attribute-value pair on an existing json11 object (c++)?
[英]Insert JSON object into an existing JSON object as a key-value-pair in Boost
我有一個 class 層次結構,如下所示: class A 由 B 類和 C 組成。 B and C each have a function that returns boost::json::object, which looks like this in case of B: {"B": "someValue"}
A 應該將這些對象中的每一個組合成這樣的結構:
{
"A": {
"B": "someValue",
"C": "someOtherValue"
}
}
我面臨的問題是,生成的 object 總是如下所示:
{
"A": [
{ "B": "someValue" },
{ "C": "someOtherValue" }
]
}
如您所見,子類中的對象不是作為鍵值對添加的,而是作為對象(每個對象包含一個對)添加到數組中。
這是重現該問題的片段:
#include <iostream>
#include <boost/json.hpp>
using namespace boost::json;
object makeObject(std::string key, int value)
{
object obj;
obj[key] = value;
return obj;
}
int main() {
object obj;
obj["main"] = {makeObject("test1", 123), makeObject("test2", 456)};
std::cout << obj << std::endl;
return 0;
}
根據 boost 的 Quick Look 文檔,我預計這不會創建一個包含單值對象的數組。 我在這里做錯了什么?
編輯
我根據sehe的回答修改了我的示例:
#include <iostream>
#include <boost/json.hpp>
auto makeProp(string_view name, value v)
{
return object::value_type(name, std::move(v));
}
int main() {
object obj;
obj["main"] = {makeProp("test1", 123), makeProp("test2", 456)};
std::cout << obj << std::endl;
return 0;
}
但這仍然會產生不希望的 output,除非我犯了錯誤:
{"main":[["test1",123],["test2",456]]}
為了進一步詳細說明我的幫助器 function 的用例,我最初打算將其作為一個快速的文章來重新創建我在上面的 class 層次結構中描述的問題。
我制作了一個更長的程序,希望以更易於理解的方式顯示問題:
#include <boost/json.hpp>
#include <iostream>
using namespace boost::json;
class B
{
public:
key_value_pair makeProp()
{
value v = {"property1", 1};
return object::value_type("B", std::move(v));
}
};
class C
{
public:
key_value_pair makeProp()
{
value v = {{"property1", 1}, {"property2", {1, 2, 3}}};
return object::value_type("C", std::move(v));
}
};
class A
{
public:
object makeProp()
{
B b;
C c;
object obj;
obj["A"] = {b.makeProp(), c.makeProp()};
return obj;
}
};
int main()
{
A a;
std::cout << a.makeProp() << std::endl;
return 0;
}
我希望這能解釋為什么我添加了幫助程序 function,並使我想要實現的目標更加清晰。
這將返回:
{
"A": [
[
"B",
[
"property1",
1
]
],
[
"C",
{
"property1": 1,
"property2": [
1,
2,
3
]
}
]
]
}
雖然我本來期望:
{
"A": {
"B": {
"property1": 1
},
"C": {
"property1": 1,
"property2": [
1,
2,
3
]
}
}
}
makeObject
返回單個對象。 您將它們作為初始化列表傳遞給json::value
,因此您應該期望{makeObject(...), makeObject(...)}
創建一個數組: docs
如果初始化列表包含鍵/值對,則創建 object。 否則創建一個數組。
相反,您想要創建一個鍵值對的初始化列表,而不是對象:
#include <iostream>
#include <boost/json/src.hpp> // for COLIRU
namespace json = boost::json;
int main() {
// construct:
json::object obj{
{"main",
{
{"test1", 123},
{"test2", 456},
}},
};
std::cout << obj << std::endl;
// update:
obj["main"] = {{"B", "someValue"}, {"C", "someOtherValue"}};
std::cout << obj << std::endl;
}
看它住在 Coliru 上:
{"main":{"test1":123,"test2":456}}
{"main":{"B":"someValue","C":"someOtherValue"}}
如果您/需要/有幫助器 function 出於某種原因:
auto makeProp(std::string_view name, json::value v) {
return json::object::value_type(name, std::move(v));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.