Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 仅将json中的某些值替换为json_Javascript_C++ - Fatal编程技术网

Javascript 仅将json中的某些值替换为json

Javascript 仅将json中的某些值替换为json,javascript,c++,Javascript,C++,以下是一个例子: 我有这个杰索纳 { "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; 有一种

以下是一个例子:

我有这个杰索纳

{ "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检查每个值?

我刚刚写了以下内容:

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];

        }
    }

}

在这里查看:

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

以下是主要节目:

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";
}
当然,这就引出了一个问题:
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;
    }
};
struct make_love:boost::static_visitor
{
布尔运算符()(对象&a,对象常量&b)常量{
用于(自动el:b值)
递归(一个[el.first],el.second);
返回true;
}
模板布尔运算符()(T&a、U常量和b)常量
{返回false;}
私人:
无效递归(值和a、值常量和b)常量{
如果(!boost::apply_visitor(*this,a,b))
a=b;
}
};

上下文中的完整代码(JSON.hpp/JSON.cpp):

这看起来是可行的:您使用哪种语言?您是对的。我用的是js。我还找到了扩展方法(jQuery和下划线)。谢谢@Thilo.So,您的问题实际上是关于JavaScript对象,而不是JSON?(作为提醒,JSON是一种数据交换格式,如XML或CSV)exaclty!js对象(我没有写它…我只选择“object”作为标记,但在删除这个标记之后…)请注意,您正在处理JavaScript对象,而不是JSON。OP并没有提到他们使用的是哪种语言。这似乎只在两个层面上起作用。也许递归会有所帮助。而且,它不会添加任何只在B中(但不在A中)的新属性。当然,这可能是规范的一部分。嗯,是的。我只是想举个例子,希望OP可以根据需要修改它。我不知道,如果我有更多的信息,我可能会制作一些不同的东西。至于其他阅读的人,作为参考,老实说,我建议看看stackoverflow.com/a/383245/14955,正如@Thilo在OP上评论的那样。这只是我写的东西,但是,让它递归并仔细观察第二个对象将是一种更好的方法。太好了,谢谢你!我在用javascript写东西。但我认为这对我正在做的项目也很有帮助。真的谢谢!干杯,我刚刚更新了
make_love
实现,以处理异构叶节点,而不会出现问题和报告故障。它缩短了12行,我更改了演示测试用例以显示新特性。
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;
    }
};