【问题标题】:replace only some value from json to json仅将一些值从 json 替换为 json
【发布时间】:2013-07-18 08:47:10
【问题描述】:

示例如下:

我有这个 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 检查每个值?

【问题讨论】:

  • 这看起来可行:stackoverflow.com/a/383245/14955
  • 您使用哪种语言?
  • 你是对的。我正在使用.js。我还找到了执行此操作的扩展方法(jQuery 和下划线)。谢谢@Thilo。
  • 那么,您的问题实际上是关于 JavaScript 对象,而不是 JSON? (提醒一下,JSON 是一种数据交换格式,如 XML 或 CSV)
  • 准确! js对象(不是我写的……我只选择了“对象”作为标签,但是在你删除了这个标签之后……)

标签: javascript


【解决方案1】:

因为你没有指定语言标签,所以我继续在中实现它。

这是主程序:

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.hpp/JSON.cpp):https://github.com/sehe/spirit-v2-json/blob/q17711850/test.cpp

【讨论】:

  • 太好了,谢谢你!我在用javascript写。但我认为这对我正在做的项目也很有帮助。真的谢谢!
  • 干杯,我刚刚更新了make_love 实现以处理异构叶节点而不会出现问题并报告失败。它缩短了 12 行,我更改了演示测试用例以显示新功能。
【解决方案2】:

我刚刚写了这个:

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/

【讨论】:

  • 请注意,您正在处理 JavaScript 对象,而不是 JSON。 OP 没有提及他们使用的是哪种语言。
  • 这似乎只在两个层次上起作用。也许递归可以提供帮助。
  • 此外,它不会添加任何仅在 B 中(但不在 A 中)的新属性。当然,这可能是规范的一部分。
  • 嗯,是的。好吧,我只是想举个例子,希望OP可以根据需要对其进行修改。我不知道,如果我有更多的信息,我可能会产生一些不同的东西。
  • 至于其他人阅读,作为参考,老实说,我建议查看 stackoverflow.com/a/383245/14955,因为@Thilo 对 OP 发表了评论。这只是我写的东西,但是让它递归并仔细观察第二个对象会是一种更好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 2022-11-29
  • 1970-01-01
相关资源
最近更新 更多