Программно объединить два объекта JSON
У меня есть два объекта JSON здесь, сгенерированные через API поиска Google. 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 код отличный, но я несколько независим от языка, поэтому любая помощь на любом языке будет очень признательна.
может ли кто-нибудь оказать какую-либо помощь и/или совет по этому поводу?
EDIT: Эти результаты в конечном итоге будут сохранены в базе данных, поэтому любые серверные методы будут фантастическими, даже если это означает, что они будут помещены прямо в таблицу для работы позже.
8 ответов
function MergeJSON (o, ob) {
for (var z in ob) {
o[z] = ob[z];
}
return o;
}
Это очень похоже на код от Elliot, но в некоторых условиях немного безопаснее. Он не добавляет функцию к объекту, что может привести к некоторым синтаксическим проблемам, при использовании в рамках, таких как 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}
спасибо Эллиот
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}
кроме того, если вы действительно хотите сделать результаты манипуляции на стороне сервера,в этой статье Кажется, дает довольно разумное прохождение процесса.
вместо того, чтобы объединить два результата вместе, я просто решил разобрать их, а затем связать эти два вместе. В конце концов, не было необходимости объединять их вместе, когда их можно было легко объединить в базе данных.
Если вы до решения на стороне клиента (JavaScript на самом деле) , как насчет попытки функции "unite", которую я написал:http://code.google.com/p/av-jslib/source/browse/js/aV.ext.object.js#36
Я не уверен, как вы полностью объедините эти вещи, учитывая, что в каждом есть много дополнительных данных, кроме самих результатов, но если вы просто хотите массив 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);
}
чтобы сделать его более аккуратным, можно добавить 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);