2009-07-29 53 views
6

Tengo dos objetos JSON aquí, generados a través de la API de búsqueda de Google. Las URL de estos objetos se pueden encontrar a continuación.Fusionar dos objetos JSON mediante programación

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

Como se puede ver la primera URL devuelve los ocho primeros resultados, mientras que el segundo devuelve el siguiente ocho. En lugar de verificar estos resultados por separado, me gustaría programáticamente fusionarlos en un objeto JSON y pasarlos como los primeros dieciséis resultados.

He intentado esto con un par de objetos JSON muy simples, pero lo que devuelve Google es todavía un poco por encima de mi cabeza, así que estoy esperando por un poco de ayuda con hacer tal cosa.

Por lo que me han dicho, no está en contra de los Términos de Servicio de Google fusionar dos objetos en uno, solo que estos siempre tienen dos resultados (que lo harán). Algunos amigos me han señalado herramientas automatizadas que son capaces de hacer tales cosas, pero aún no he encontrado una herramienta de este tipo.

Actualmente estoy trabajando en ASP.NET, por lo que el código C# o VB.NET es excelente, pero soy un tanto independiente del idioma por lo que cualquier ayuda en cualquier idioma será muy apreciada.

¿Alguien puede brindar ayuda y/o asesoramiento para hacer tal cosa?

EDIT: Estos resultados eventualmente se guardarán en una base de datos, por lo que cualquier método del lado del servidor sería fantástico, incluso si eso significa ponerlos directamente en una tabla para tratar más adelante.

+0

Es posible que alguien ya ha escrito un C# Google API envoltorio ... esto parece prometedor: http://www.codeplex.com/GAPIdotNET – Domenic

Respuesta

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

Esto se parece mucho a un código de Elliot, pero es un poco más seguro en algunas condiciones. No agrega una función al objeto, lo que podría generar algunos problemas de sintaxis cuando se utiliza con un marco como Extjs o jQuery. Tuve el problema de que me causaba problemas de sintaxis cuando se usaba en un detector de eventos. Pero los créditos van a Elliot, él hizo el trabajo.

Utilice esta de la siguiente manera:

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} 

Gracias Elliot

0

No estoy seguro de cómo fusionar estas cosas por completo, dado que hay una gran cantidad de datos adicionales en cada uno aparte de los resultados en sí, pero si solo quieres una matriz de JavaScript que contenga los 16 resultados, esto debería funcionar ...

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); 
} 
+0

El puesto está pidiendo una solución .NET, no una solución JavaScript ... Cometí el mismo error, pero creo que es mejor eliminar las soluciones de JavaScript para ayudar a despejar la cuestión. – Blixt

1

Además, si usted realmente quiere hacer la manipulación resultados de página de servidor, this article parece dar un tutorial bastante razonable del proceso.

+0

Ya he leído este enfoque, y si bien parece bastante simple con objetos JSON simples, he tenido problemas con la loca salida de Google. Mi objetivo general es mostrar los doce resultados de búsqueda e ingresarlos en una base de datos, por lo que sería genial si pudieran ser tomados individualmente y agregados a las variables dentro de una página ASP.NET. Volveré a probar este método pronto y publicaré mis resultados. –

1

En lugar de fusionar los dos resultados juntos, yo sólo decidió analizar ellos, entonces une esos dos juntos. Al final, realmente no hubo necesidad de fusionar los dos juntos cuando se podían unir fácilmente dentro de una base de datos.

4
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} 
+0

esto obviamente no funcionará para objetos anidados - considere la fusión de dos objetos: '{" a ": {" b ": 5}}' y '{" a ": {" c ": 5}}' - el resultado debería ser '{" a ": {" b ": 5," c ": 5}}', mientras que lo anterior devolverá '{" a ": {" c ": 5}}'. Sin embargo, condición adicional: 'para (z var en ob) { si (ob.hasOwnProperty (z)) { si (o [z] && typeof o [z] == 'objeto' && typeof ob [z] == 'objeto') o [z] = o [z] .merge (ob [z]); else o [z] = ob [z]; } } ' debería arreglarlo (no probado). – eithed

0

para que sea más limpio, puede agregar la función merge al objeto JSON. Esta es la solución de Johan van de Merwe basada en la respuesta de Elliot, agregada al objeto JSON real.

// Extend JSON object 
JSON.merge = function (o,ob) { 

    for (var z in ob) { 
    o[z] = ob[z]; 
    } 

    return o; 
} 

json3 = JSON.merge(json1,json2);