【问题标题】:Merge two JSON objects programmatically以编程方式合并两个 JSON 对象
【发布时间】:2010-11-14 23:58:34
【问题描述】:

我在这里有两个 JSON 对象,通过 Google 搜索 API 生成。这些对象的 URL 可以在下面找到。

http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=hello%20world&rsz=large http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=hello%20world&rsz=large&start=8

如您所见,第一个 URL 返回前 8 个结果,而第二个 URL 返回接下来的 8 个结果。我不想单独检查这些结果,而是以编程方式将它们合并到一个 JSON 对象中,并将它们作为前 16 个结果传递。

我已经尝试使用几个非常简单的 JSON 对象,但 Google 返回的结果仍然有点超出我的想象,所以我希望在做这样的事情时能得到一些帮助。

据我所知,将两个对象合并为一个对象并不违反 Google 的服务条款,只是这些对象始终作为两个结果进行处理(它们会这样做)。一些朋友向我指出了能够做这些事情的自动化工具的方向,但我还没有找到这样的工具。

我目前在 ASP.NET 中工作,因此 C# 或 VB.NET 代码很棒,但我有点独立于语言,因此非常感谢任何语言的帮助。

任何人都可以提供任何帮助和/或建议来做这样的事情吗?

编辑:这些结果最终将保存到数据库中,因此任何服务器端方法都会非常棒,即使这意味着将它们直接放入表中以供以后处理。

【问题讨论】:

标签: c# asp.net json string-concatenation


【解决方案1】:
function MergeJSON (o, ob) {
      for (var z in ob) {
           o[z] = ob[z];
      }
      return o;
}

这看起来很像 Elliot 的代码,但在某些情况下更安全一些。当与 Extjs 或 jQuery 等框架一起使用时,它不会向对象添加函数,这可能会导致一些语法问题。我遇到的问题是,它在事件侦听器中使用时给我的语法带来了问题。但归功于 Elliot,他完成了这项工作。

如下使用:

a = {a : 1}
b = {b : 2}
c = {c : 3}

x = MergeJSON ( a, b);
x = MergeJSON ( x, c);

result : x  == {a : 1, b : 2, c : 3}

谢谢艾略特

【讨论】:

    【解决方案2】:
    Object.prototype.merge = (function (ob) {
        var o = this;
        var i = 0;
        for (var z in ob) {
            if (ob.hasOwnProperty(z)) {
                o[z] = ob[z];
            }
        }
        return o;
    })
    
    var a = {a:1}
    var b = {b:2}
    
    var c = a.merge(b); // === {a:1,b:2}
    

    【讨论】:

    • 这显然不适用于嵌套对象 - 考虑合并两个对象:{"a": {"b": 5}}{"a": {"c": 5}} - 结果应该是 {"a": {"b": 5, "c": 5}},而上面将返回 {"a": {"c": 5}}。但是,附加条件:for (var z in ob) { if (ob.hasOwnProperty(z)) { if (o[z] && typeof o[z] == 'object' && typeof ob[z] == 'object') o[z] = o[z].merge(ob[z]); else o[z] = ob[z]; } } 应该修复它(未测试)。
    【解决方案3】:

    另外,如果您真的想在服务器端进行结果操作,this article 似乎给出了一个相当合理的流程演练。

    【讨论】:

    • 我已经通读过这种方法,虽然它对于简单的 JSON 对象看起来很简单,但我一直在为 Google 的疯狂输出而苦苦挣扎。我的总体目标是显示所有 12 个搜索结果并将它们输入到数据库中,因此如果可以单独抓取它们并将其添加到 ASP.NET 页面中的变量中,那就太好了。我很快会再试一次这种方法并发布我的结果。
    【解决方案4】:

    我没有将这两个结果合并在一起,而是决定解析它们,然后将这两个结果链接在一起。最后,当它们可以轻松地在数据库中连接时,真的不需要将它们合并在一起。

    【讨论】:

      【解决方案5】:

      如果您需要客户端解决方案(实际上是 JavaScript),那么尝试我编写的“联合”函数怎么样:http://code.google.com/p/av-jslib/source/browse/js/aV.ext.object.js#36

      【讨论】:

        【解决方案6】:

        使用 Jquery,您可以做到这一点!

        a = $.extend({a:1}, {b:2});
        
        result: Object { a=1,  b=2}
        

        http://api.jquery.com/jQuery.extend/

        【讨论】:

          【解决方案7】:

          我不确定您如何完全合并这些内容,因为除了结果本身之外,每个内容中还有很多额外的数据,但如果您只想要一个包含所有 16 个结果的 JavaScript 数组,这应该可以。 ..

          var responses = [GetJsonObjectFromThatUriUsingJqueryOrSomething(),
                           GetJsonObjectFromThatOtherUriUsingJqueryOrSomething()];
          
          // Probably want to check for success
          // and ensure that responses[i].responseData.results is valid.
          
          var results = [];
          for (var i = 0; i < responses.length; ++i)
          {
              results = results.concat(responses[i].responseData.results);
          }
          

          【讨论】:

          • 帖子要求的是 .NET 解决方案,而不是 JavaScript 解决方案...我犯了同样的错误,但我认为最好删除 JavaScript 解决方案以帮助解决问题。
          【解决方案8】:

          为了更简洁,您可以将 merge 函数添加到 JSON 对象。 这是 Johan van de Merwe 根据 Elliot 的回答提出的解决方案,添加到实际的 JSON 对象中。

          // Extend JSON object
          JSON.merge = function (o,ob) {
          
            for (var z in ob) {
              o[z] = ob[z];
            }
          
            return o;
          }
          
          json3 = JSON.merge(json1,json2);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-16
            • 2018-01-14
            • 2022-01-16
            • 2015-08-03
            • 1970-01-01
            • 1970-01-01
            • 2011-01-17
            • 2019-12-17
            相关资源
            最近更新 更多