微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何确定Boost属性树使用的数据类型?

如何解决如何确定Boost属性树使用的数据类型?

我正在为项目使用Boost属性树,但遇到了问题。我正在这样使用它:

using Namespace boost::property_tree;
ptree proot;

int myInt = 5;

proot.put("Number",myInt);

write_json("myjson.json",proot);

如果我这样使用它,则安全的数据类型是字符串,而不是int。我的意思是一个例子:

{ "Number": "5" } //what i get
{ "Number": 5 } //what i want

有办法改变吗?

解决方法

我成功地尝试了类似的方法,并且它们运行良好,没有受到任何黑客攻击,请在此处查看我的方法:

Why does Boost property tree write_json save everything as string? Is it possible to change that?

这需要一些努力(您必须提供一个自己的JSON编写器并专门化阅读器的某些部分),但是一般来说这是值得的,因为您还将在许多情况下观察到性能的提高。

,

不,您不能更改此行为,因为字符串值类型已被大量植入boost::property_tree中。从技术上讲,您可以使用与默认模板类型不同的模板类型参数,但是您会松散进入该库的大部分转换逻辑。

作为一种有点怪异的选择,请考虑以下内容。

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>

using namespace boost::property_tree;
using boost::property_tree::json_parser::create_escapes;

void writeJsonValue(std::ostream& stream,const ptree& pt)
{
    const auto raw = pt.get_value<std::string>();

    if (raw == "true" || raw == "false") {
        stream << raw;
        return;
    }

    if (const auto integral = pt.get_value_optional<int>())
        stream << *integral;
    else
        stream << '"' << create_escapes(raw) << '"';
}

这实质上恢复了一些预定义的类型信息丢失。您可以在Boost的json输出函数的修改版本中使用它:

void writeJson(std::ostream& stream,const ptree& pt,int indent = 0)
{
    static const auto indentStr = [](int level) { return std::string(4 * level,' '); };

    if (indent > 0 && pt.empty())
        writeJsonValue(stream,pt);
    else if (indent > 0 && pt.count(std::string()) == pt.size()) {
        stream << "[\n";

        for (auto it = pt.begin(); it != pt.end(); ++it) {
            stream << indentStr(indent + 1);
            writeJson(stream,it->second,indent + 1);
            if (boost::next(it) != pt.end())
                stream << ',';
            stream << '\n';
        }

        stream << indentStr(indent) << ']';
    } else {
        stream << "{\n";

        for (auto it = pt.begin(); it != pt.end(); ++it) {
            stream << indentStr(indent + 1);
            stream << '"' << create_escapes(it->first) << "\": ";
            writeJson(stream,';
            stream << '\n';
        }

        stream << indentStr(indent) << '}';
    }
}

调用它作为您的数据,例如

 writeJson(std::cout,proot);

,输出应为

{
    "Number": 5
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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”。这是什么意思?