簡體   English   中英

將 JSON object 插入現有的 JSON ZA8CFDE6331BD59EB2AC96F8911C4B6666 中的鍵值對中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM