c++14中的JSON数据处理Boost

如何解决c++14中的JSON数据处理Boost

我是 C++ 新手(我大部分时间使用嵌入式 c)。我有这样的 JSON 数据:

[10,"Session",{"currentYear":"2048","accidents":10,"status":"Accepted"}]

我正在尝试处理此数据:

boost::json::value testVal;
boost::json::error_code ec;
testVal = boost::json::parse(data,ec);

所以我在 testVal 中有多个项目,我需要从 testVal 获取对象来测试如下内容:

boost::json::object testObj = testVal.get_object();
if(testObj.at("currentYear") == "2048")
{
// Do Something
}

但是我无法获取对象的实例,我正在寻找的数据在哪里。

知道如何检查(使用 boost::json)当前年份中的数据是否为 ​​2048?

感谢您的帮助。

解决方法

直截了当

Compiler Explorer

for (auto& element : testVal.as_array()) {
    if (!element.is_object())
        continue;
    if (element.as_object()["currentYear"].as_string() == "2048") {
        std::cout << element << std::endl;
    }
}

虽然我建议使用库中的转换工具。 (稍后会添加示例)

value_to

魔术转换结果有点人为,因为您的输入......未指定。我假设您从数组中过滤对象,为了好玩,我们将 Accepted 值的大小写和空格不敏感解析为某种枚举:

Godbolt

#include <boost/json.hpp>
#include <boost/json/src.hpp>
#include <boost/range/adaptors.hpp>
#include <boost/spirit/home/x3.hpp>
#include <iostream>
namespace json = boost::json;
using boost::adaptors::filtered;

struct Insurance {
    long   currentYear,accidents;
    enum class Status { Accepted,Rejected,Pending } status;

    friend Status tag_invoke(json::value_to_tag<Status>,json::value const& v) {
        using namespace boost::spirit::x3;

        static const struct S : symbols<Status> {
            S() { this->add
                ("accepted",Status::Accepted)
                ("rejected",Status::Rejected)
                ("pending",Status::Pending);
            }
        } _sym;

        Status result;
        auto& str = v.as_string();

        if (not phrase_parse(str.begin(),str.end(),no_case[_sym] >> eoi,space,result))
            throw std::domain_error("Status");
        return result;
    }
    friend Insurance tag_invoke(json::value_to_tag<Insurance>,json::value const& v) {
        auto& o = v.as_object();
        return {
            std::atol(o.at("currentYear").as_string().data()),o.at("accidents").as_int64(),Status{}
        };
    }
};

json::value make_array(auto&& range) {
    return json::array(range.begin(),range.end());
}

int main() {
    auto data = boost::json::parse(R"(
        [10,"Session",{"currentYear":"2048","accidents":10,"status":"Accepted"},{"currentYear":"2049","accidents":11,"status":" rejected"},{"currentYear":"2050","accidents":12,{"currentYear":"2051","accidents":13,"status":"pendinG"},12,"Session"
    ]
    )").as_array();

    auto objects = make_array(data | filtered(std::mem_fn(&json::value::is_object)));

    auto vec = json::value_to<std::vector<Insurance>>(objects);

    for (Insurance const& obj : vec) {
        std::cout << "Year: " << obj.currentYear
                  << " Accidents:" << obj.accidents << std::endl;
    }
}

印刷品

Year: 2048 Accidents:10
Year: 2049 Accidents:11
Year: 2050 Accidents:12
Year: 2051 Accidents:13

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?