Search code examples
c++boostboost-propertytree

C++ boost ptree rename key


In a boost property tree, I would like to rename a key such as a.b.c2 to a.b.c3.

One method is to remove the node and put its copy with another name. The problem is that the node is placed at the end of its other siblings. I prefer to keep the order. How can I fix this code?

#include <iostream>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/json_parser.hpp>
#include <boost/algorithm/string/predicate.hpp>

using namespace boost::property_tree;

void print(const ptree &p)
{
    json_parser::write_json(std::cout, p);
}

int main()
{
    ptree pt0;

    pt0.put("a.b.c1",4);
    pt0.put("a.b.c2.e1",4);
    pt0.put("a.b.c4",2);
    pt0.put("a.d",4);
    pt0.put("k.m",4);
    pt0.put("k.n.as",4);

    std::string key_parent="a.b";
    std::string full_key="a.b.c2";
    std::string full_key2="a.b.c3";
    ptree node=pt0.get_child(full_key);
    pt0.get_child(key_parent).erase("c2");
    pt0.put_child(full_key2,node);

    print(pt0);

    return 0;
}

Results :(

// before:
{
    "a": {
        "b": {
            "c1": "4",
            "c2": {
                "e1": "4"
            },
            "c4": "2"
        },
        "d": "4"
    },
    "k": {
        "m": "4",
        "n": {
            "as": "4"
        }
    }
}


// after:
{
    "a": {
        "b": {
            "c1": "4",
            "c4": "2",
            "c3": {
                "e1": "4"
            }
        },
        "d": "4"
    },
    "k": {
        "m": "4",
        "n": {
            "as": "4"
        }
    }
}

Solution

  • You can use insert and iterator to do this.

    ptree &child = pt0.get_child("a.b");
    ptree::iterator it = child.to_iterator(child.find("c2"));
    child.insert(it, make_pair("c3", it->second));
    child.erase(it);