Программно объединить два объекта JSON

У меня есть два объекта JSON, сгенерированных через Google Search 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 возвращает первые восемь результатов, а второй - следующие восемь. Вместо того, чтобы проверять эти результаты по отдельности, я хотел бы программно объединить их в один объект JSON и передать их как первые шестнадцать результатов.

Я попытался сделать это с помощью пары чрезвычайно простых объектов JSON, но то, что возвращает Google, все еще немного выше моей головы, поэтому я надеюсь на небольшую помощь в этом.

Насколько мне сказали, слияние двух объектов в один не противоречит Условиям обслуживания Google, только то, что они всегда проходят как два результата (что так и будет). Некоторые друзья указали мне направление автоматизированных инструментов, способных делать такие вещи, но я еще не нашел такого инструмента.

В настоящее время я работаю в ASP.NET, поэтому код C # или VB.NET великолепен, но я в некоторой степени не зависящий от языка, поэтому любая помощь на любом языке будет очень признательна.

Может ли кто-нибудь помочь и / или посоветовать, как это сделать?

РЕДАКТИРОВАТЬ: Эти результаты в конечном итоге будут сохранены в базе данных, поэтому любые серверные методы будут фантастическими, даже если для этого потребуется поместить их прямо в таблицу для дальнейшего использования.


person Mike B    schedule 29.07.2009    source источник
comment
Возможно, кто-то уже написал оболочку C # Google API ... это выглядит многообещающе: codeplex.com/GAPIdotNET   -  person Domenic    schedule 29.07.2009


Ответы (8)


function MergeJSON (o, ob) {
      for (var z in ob) {
           o[z] = ob[z];
      }
      return o;
}

Это очень похоже на код от Эллиота, но в некоторых условиях немного безопаснее. Это не добавление функции к объекту, что может привести к некоторым синтаксическим проблемам при использовании с такими фреймворками, как Extjs или jQuery. У меня была проблема в том, что это дало мне проблемы с синтаксисом при использовании в прослушивателе событий. Но следует отдать должное Эллиоту, он сделал свою работу.

Используйте это следующим образом:

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}

Спасибо, Эллиот

person Johan van de Merwe    schedule 06.08.2010

Кроме того, если вы действительно хотите обрабатывать результаты на стороне сервера, это статья, кажется, дает довольно разумное пошаговое описание процесса.

person Domenic    schedule 29.07.2009
comment
Я уже читал этот подход, и, хотя он кажется достаточно простым с простыми объектами JSON, я боролся с сумасшедшим выводом Google. Моя общая цель - показать все двенадцать результатов поиска и ввести их в базу данных, поэтому было бы здорово, если бы их можно было получить по отдельности и добавить к переменным на странице ASP.NET. Я скоро еще раз попробую этот метод и опубликую свои результаты. - person Mike B; 29.07.2009

Вместо того, чтобы объединять два результата вместе, я просто решил проанализировать их, а затем связать их вместе. В конце концов, действительно не было необходимости объединять их вместе, когда их можно было легко объединить в базе данных.

person Mike B    schedule 11.01.2010

Если вам нужно решение на стороне клиента (на самом деле JavaScript), как насчет того, чтобы попробовать функцию "объединить", которую я написал: http://code.google.com/p/av-jslib/source/browse/js/aV.ext.object.js#36

person BYK    schedule 29.07.2009

С JQuery вы можете это сделать!

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

result: Object { a=1,  b=2}

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

person Diego Gallardo    schedule 02.11.2010

Я не уверен, как бы вы могли полностью объединить эти вещи, учитывая, что в каждом из них много дополнительных данных, кроме самих результатов, но если вам просто нужен массив JavaScript, содержащий все 16 результатов, это должно сработать ...

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);
}
person Domenic    schedule 29.07.2009
comment
В сообщении запрашивается решение .NET, а не решение JavaScript ... Я сделал ту же ошибку, но я думаю, что лучше всего удалить решения JavaScript, чтобы облегчить вопрос. - person Blixt; 29.07.2009

Чтобы сделать его более понятным, вы можете добавить функцию merge к объекту JSON. Это решение от Йохана ван де Мерве на основе ответа Эллиота, добавленного к фактическому объекту 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);
person Max Kielland    schedule 23.11.2011

person    schedule
comment
очевидно, что это не сработает для вложенных объектов - рассмотрите возможность слияния двух объектов: {"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]; } } должно исправить это (не проверено). - person eithed; 23.02.2012