当前位置: 首页 > 面试题库 >

为什么Boost属性树write_json会将所有内容保存为字符串?有可能改变吗?

卞嘉许
2023-03-14
问题内容

我正在尝试使用boost属性树write_json进行序列化,它将所有内容保存为字符串,这并不是数据错误,但是我每次都需要显式地转换它们,并且想在其他地方使用它们。(例如在python或其他C
++ json(非boost)库中)

这是一些示例代码,我所得到的取决于语言环境:

boost::property_tree::ptree root, arr, elem1, elem2;
elem1.put<int>("key0", 0);
elem1.put<bool>("key1", true);
elem2.put<float>("key2", 2.2f);
elem2.put<double>("key3", 3.3);
arr.push_back( std::make_pair("", elem1) );
arr.push_back( std::make_pair("", elem2) );
root.put_child("path1.path2", arr);

std::stringstream ss;
write_json(ss, root);
std::string my_string_to_send_somewhare_else = ss.str();

并且my_string_to_send_somewhere_else…… 像这样:

{
    "path1" :
    {
       "path2" :
       [
            {
                 "key0" : "0",
                 "key1" : "true"
            },
            {
                 "key2" : "2.2",
                 "key3" : "3.3"
            }
       ]
    }
}

无论如何,有没有将它们另存为值,例如: "key1" : true"key2" : 2.2


问题答案:

我最终在我的工具中添加了另一个功能来解决此问题:

#include <string>
#include <regex>
#include <boost/property_tree/json_parser.hpp>

namespace bpt = boost::property_tree;
typedef bpt::ptree JSON;
namespace boost { namespace property_tree {
    inline void write_jsonEx(const std::string & path, const JSON & ptree)
    {
        std::ostringstream oss;
        bpt::write_json(oss, ptree);
        std::regex reg("\\\"([0-9]+\\.{0,1}[0-9]*)\\\"");
        std::string result = std::regex_replace(oss.str(), reg, "$1");

        std::ofstream file;
        file.open(path);
        file << result;
        file.close();
    }
} }

希望有帮助。



 类似资料:
  • 问题内容: 我不明白为什么整数在串联中被视为字符串文字。例如 输出为:。 为什么不添加,为什么要添加? 问题答案: 该表达式从左到右求值。前两个操作数均为(10和30),因此第一个执行加法。 下一个获取操作数(40)和操作数(“ Sachin”),因此将其转换为并执行连接。 接下来的运算符获取一个操作数和一个操作数,并执行级联。 如果您想要不同的评估顺序,请使用括号: 这将输出。

  • 问题内容: Oracle Java Community网站上的一篇文章提供了以下方法作为示例(对于JPA Converter,但这并不相关): 将String y强制转换为String val有什么用?有正当的理由吗? 原始文章:JPA的新增功能 问题答案: 这样的转换是完全没有必要的。我可以想象那是以前 但是后来参数类型更改为,而作者只是忘了删除强制类型转换。

  • 问题内容: 我说了一个变量,里面有很多数据。我想通过以下方式使用此字符串的一小部分: 经过数小时的调试(使用内存可视化工具),我发现objects字段记住了的所有数据,尽管它仅包含子字符串。 当我将代码更改为: ..问题解决了!现在我的应用程序现在只占用很少的内存! 那怎么可能?谁能解释一下?我认为this.smallpart一直在引用数据,但是为什么呢? 更新:那 我怎么清除大字串?data =

  • 问题内容: 引起我注意的是,有几种方法可以比较Java中的字符串。 我只是很早以前就习惯了,以避免使用区分大小写的字符串出现问题。 另一方面,其他人则喜欢以大写或小写形式传递所有内容。 从我的立场(即使从技术上来说我坐在那里),我看不出真正的区别。 有人知道一种实践是否比另一种更好吗?如果是这样,为什么呢? 问题答案: 使用它是因为它比比较之前将两个String都转换为大写字母更具可读性。 可读性

  • volatile只能作用于变量,保证了操作可见性和有序性,不保证原子性。 在Java的内存模型中分为主内存和工作内存,Java内存模型规定所有的变量存储在主内存中,每条线程都有自己的工作内存。 主内存和工作内存之间的交互分为8个原子操作: lock unlock read load assign use store write volatile修饰的变量,只有对volatile进行assign操作