只将json中的一些值替换为json

replace only some value from json to json

本文关键字:json 替换 只将      更新时间:2023-09-26

以下是示例:

我有这个jsonA

{ "a":"1", "b":"2", "c":{"a":"1", "b":"2"} }

这个jsonB

{ "b":"2new", "c":{"a":"1new"} }

我想用jsonB中的新值更新第一个jsonA,最后得到这样的结果:

{ "a":"1", "b":"2new", "c":{"a":"1new", "b":"2"} }

我可以手动设置每个值,比如:

jsonA.b = jsonB.b;
jsonA.c.a = jsonB.c.a;

有一种方法可以自动完成,而无需使用forEach检查每个valule?

因为您没有指定语言标记,所以我继续在c++中实现了它。

这是主程序:

int main()
{
    auto jsonA = JSON::parse("{ '"a'":'"1'", '"b'":'"2'", '"c'":{'"a'":'"1'", '"b'":'"2'"} }");
    auto jsonB = JSON::parse("{ '"b'":42, '"c'":{'"a'":'"1new'"}, '"q'":[3.14,null] }");
    if (boost::apply_visitor(make_love(), jsonA, jsonB))
        std::cout << "Merged: " << jsonA;
    else
        std::cerr << "Couldn't merge '" << jsonA << "' with '" << jsonB << "''n";
}

输出:

Merged: {"a":"1","b":42,"c":{"a":"1new","b":"2"},"q":[3.14,null]}

当然,这就引出了make_love是如何实现的问题:

struct make_love : boost::static_visitor<bool>
{
    bool operator()(Object& a, Object const& b) const {
        for(auto el: b.values) 
            recurse(a[el.first], el.second);
        return true;
    }
    template<typename T, typename U> bool operator()(T& a, U const& b)  const 
        { return false; }
  private:
    void recurse(Value& a, Value const& b) const {
        if (!boost::apply_visitor(*this, a, b))
            a = b;
    }
};

上下文中的完整代码(JSON.hp/JSON.cpp):https://github.com/sehe/spirit-v2-json/blob/q17711850/test.cpp

我刚刚写了这个:

jsonA = { "a":"1", "b":"2", "c":{"a":"1", "b":"2"} }
jsonB = { "b":"2new", "c":{"a":"1new"} }
for (var j in jsonA) {
    if(jsonB.hasOwnProperty(j)) {
        if (typeof jsonA[j] === 'object') {
            for (var i in jsonA[j]) {
                if(jsonB[j].hasOwnProperty(i)) {
                   jsonA[j][i] = jsonB[j][i];
                }
            }
        } else {
            jsonA[j] = jsonB[j];
        }
    }
}

点击此处查看:http://jsfiddle.net/YtgQS/