如何构造boost::json值?

问题描述 投票:0回答:1

我有以下代码用于构造 Boost::Json 值对象。

void tag_invoke(boost::json::value_from_tag, boost::json::value& jv, AppointmentEnd const& obj)
{
    jv = { { "MridianPatientOid", obj.mridianPatientOid }, { "PdfOids", obj.pdfOids } };
}

它与 Boost 版本 1.79 完美配合。

我正在尝试升级 Boost 版本 1.86,但出现以下错误:

C:\Users\bobef\.conan2\p\b\boost8a406c6ccf4da\p\include\boost\json\impl\value_ref.hpp(36): error C2440: '<function-style-cast>': cannot convert from 'initializer list' to 'boost::json::value'

...

C:\projects\work\mercury\libs\ois-data\code\ois-data\models\states\AppointmentEnd.cpp(16): note: see reference to function template instantiation 'boost::json::value_ref::value_ref<std::vector<std::string,std::allocator<std::string>>>(const T &,void *) noexcept' being compiled
          with
          [
              T=std::vector<std::string,std::allocator<std::string>>
          ]

C:\Users\bobef\.conan2\p\b\boost8a406c6ccf4da\p\include\boost/json/value_ref.hpp(204): note: see reference to function template instantiation 'boost::json::value boost::json::value_ref::from_const<std::vector<std::string,std::allocator<std::string>>>(const void *,boost::json::storage_ptr)' being compiled
  ninja: build stopped: subcommand failed.

我可以使用以下解决方法,但它又长又难看。

void tag_invoke(boost::json::value_from_tag, boost::json::value& jv, AppointmentEnd const& obj)
{
  boost::json::object obj_;
  obj_["MridianPatientOid"] = obj.mridianPatientOid;
  obj_["PdfOids"] = array(obj.pdfOids.begin(), obj.pdfOids.end());
  jv = obj_;
}

我使用的编译器版本是

Microsoft Visual Studio Community 2022 (64-bit) Version 17.11.2

有人可以解释错误的根源并提出更紧凑的解决方法吗?

c++ boost boost-json
1个回答
0
投票

您的初始值设定项包含

obj.pdfOids
作为值。这很可能是一个容器,因此不能隐式转换为
json::value
。相反,再次使用
value_from

住在Coliru

#include <boost/json.hpp>
#include <iostream>
namespace json = boost::json;

namespace Bla {
    struct AppointmentEnd {
        std::string              mridianPatientOid;
        std::vector<std::string> pdfOids;
    };

    void tag_invoke(boost::json::value_from_tag, boost::json::value& jv, AppointmentEnd const& obj) {
        jv = {
            {"MridianPatientOid", obj.mridianPatientOid},
            {"PdfOids", json::value_from(obj.pdfOids)},
        };
    }
}

int main() {
    Bla::AppointmentEnd x{
        "ABC",
        {"pdfOid1", "pdfOid2"},
    };
    std::cout << json::value_from(x) << std::endl;
}

印刷

{"MridianPatientOid":"ABC","PdfOids":["pdfOid1","pdfOid2"]}
© www.soinside.com 2019 - 2024. All rights reserved.