【问题标题】:Boost ptree get<std::string>() return non printable characters?Boost ptree get<std::string>() 返回不可打印字符?
【发布时间】:2018-06-29 16:31:28
【问题描述】:

我想知道 ptree get 函数是否有可能在 JSON 字符串上调用如下:
get&lt;std::string&gt;("string") 返回不可打印字符?如果是这样,我如何最好地过滤掉它们?
我看到的问题是我将字符串插入std::map,之后的每个实例都应该只更新原始条目,但最终会出现多个条目。

我使用if (mymap-&gt;insert(std::make_pair(str, dat)).second == false){(其中str 是上述get() 函数的结果)来检查现有条目 - 或插入新条目。
dat 是与@987654327 关联的数据结构@ 如果条目已经存在,则应该更新它(这发生在 false 案例中)。

【问题讨论】:

    标签: boost ascii stdmap


    【解决方案1】:

    我想知道 ptree get 函数是否可以这样调用: 在 JSON 字符串上获取(“字符串”)以返回不可打印的字符?

    不能在 (JSON) 字符串上调用 get&lt;std::string&gt;。但是,您可以ptree 上调用它,当然它可以返回数据。因此,如果该数据包含不可打印的内容,那么它们就在您的数据中。

    我使用if (mymap-&gt;insert(std::make_pair(str, dat)).second == false){(其中str 是上述get() 函数的结果)来检查现有条目 - 或插入新条目。

    这是正确的方法 - 假设您的密钥等价¹确实由 std::less&lt;std::string&gt; 给出。

    dat 是与 str 关联的数据结构,如果条目已经存在,则应更新它(在 false 情况下发生)。

    在这种情况下,考虑检查是否存在,而实际上只是更新:

     mymap[str] = dat;
    

    如果键不存在,这将自动插入一个新元素。请注意,这不会改变与键相关的行为。

    演示

    简化以检查您的理解:

    Live On Coliru

    #include <map>
    #include <string>
    #include <iostream>
    #include <iomanip>
    
    struct dat {
        int i, j, k;
    };
    
    static inline std::ostream& operator<<(std::ostream& os, dat const& d) {
        return os << "{" << d.i << "," << d.j << "," << d.k << "}";
    }
    
    using Map = std::map<std::string, dat>;
    
    void dump(Map const& m) {
        std::cout << " --- Map: \n";
        for (auto& entry : m) {
            std::cout << std::quoted(entry.first) << " -> " << entry.second << "\n";
        }
    }
    
    int main() {
        Map mymap {
            { "one", {1,2,3} },
            { "two", {2,4,6} },
            { "three", {3,6,9} },
        };
    
        dump(mymap);
    
        mymap["four"] = {4,8,12}; // adds
        dump(mymap);
    
        mymap["three"] = {0,0,0}; // overwrites
        dump(mymap);
    
        mymap["three "] = {-1,-1,-1}; // adds new key
        dump(mymap);
    }
    

    打印

     --- Map: 
    "one" -> {1,2,3}
    "three" -> {3,6,9}
    "two" -> {2,4,6}
     --- Map: 
    "four" -> {4,8,12}
    "one" -> {1,2,3}
    "three" -> {3,6,9}
    "two" -> {2,4,6}
     --- Map: 
    "four" -> {4,8,12}
    "one" -> {1,2,3}
    "three" -> {0,0,0}
    "two" -> {2,4,6}
     --- Map: 
    "four" -> {4,8,12}
    "one" -> {1,2,3}
    "three" -> {0,0,0}
    "three " -> {-1,-1,-1}
    "two" -> {2,4,6}
    

    ¹弱全序

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      相关资源
      最近更新 更多