2010-07-26 24 views
5

Estoy teniendo dificultades para acceder a los datos de respuesta JSON devueltos del nuevo Facebook JS SDKnuevas llamadas API de gráficos.Accediendo a los datos de la respuesta de FB.api()

Por ejemplo, en algunos de sus documentos en los que están utilizando la vieja manera de utilizar el SDK, que obtener un puntero a los datos por la respuesta [0]

pero aquí, se demuestra que es necesario utilizar response.data [0] en su lugar: http://developers.facebook.com/tools/console/ (haga clic en fb.api - álbumes de fotos)

¿Entonces cuál es? Sé que con mi código a continuación, si trato de usar el tipo de sintaxis de respuesta [0] para obtener el JSON devuelto, no estoy definido.

Si utilizo respuesta [0] .length También consigo indefinido

Pero si intento response.data [0] .length consigo 2, que supongo que es el JSON devuelto o mi 2 albums..I simplemente no sé cómo jugar con este objeto devuelto en términos de sintaxis y manipulación, sus propiedades, etc.

Quiero al final analizar el JSON devuelto utilizando el método jQuery parseJSON, pero no tengo ni idea de cómo incluso pasar la sintaxis correcta aquí para la respuesta y simplemente usar ese objeto de respuesta.

FB.api(uri, function(response) 
{ 
    alert("response: " + response); 

    // check for a valid response 
    if (response == "undefined" || response == null || !response || response.error) 
    { 
     alert("error occured"); 
     return; 
    } 

    alert("response length: " + response.data.length); 
} 

esta alerta me dio 2 que tiene sentido. Tengo 2 álbumes.

intenté algo así como response.data [0] e intenté con jQuery parseJSON(response.data) o parseJSON(response.data[0]) en eso y no funciona. Entonces, ¿alguien puede explicar el objeto de respuesta aquí en lo que respecta a Facebook, supongo? No veo ningún documento sobre cómo usar ese objeto devuelto y cómo se construye.

Actualizado:

Ok, así que aquí está todo el intento método de análisis sintáctico que he apagó hasta ahora. No sé si el análisis de jQuery todavía es 100% bueno, en cierto modo lo apagué, pero ni siquiera puedo probarlo hasta que descubra cómo volver a utilizar este objeto de respuesta. Sé que está devolviendo JSON porque analicé otro objeto de respuesta de Facebook en otro método en JS SDK, así que estoy bastante seguro de que la respuesta [0] o response.data [0] te dará la cadena JSON.

function GetAllFacebookAlbums(userID, accessToken) 
{ 
    alert("inside GetAllFacebookAlbums(userID, acessToken)"); 

    var dFacebookAlbums = {}; // dictionary 
    var uri = "/" + userID + "/albums?access_token=" + accessToken; 
    //var uri = "/me/albums"; 

    alert("get albums uri: " + uri); 

    FB.api(uri, function(response) 
    { 
     alert("response: " + response); 

     // check for a valid response 
     if (response == "undefined" || response == null || !response || response.error) 
     { 
      alert("error occured"); 
      return; 
     } 

     alert("response length: " + response.data.length); 

     for (var i=0, l=response.data.length; i<l; i++) 
     { 
      alert("response[key]: " + response.data[i].Name); 
     } 

     // parse JSON from response 
     var dJSONObjects = jQuery.parseJSON(response.data); 

     alert("dJSONObjects: " + dJSONObjects); 

     if (dJSONObjects.length == 0) 
      return; 

     // iterate through the dictionary of returned JSON objects 
     // and transform each to a custom facebookAlbum object 
     // then add each new FacebookAlbum to the final dictionary 
     // that will return a set of facebookAlbums 
     $.each(json.attributes, function() { 
      // add a new album to the dictionary 
      aFacebookAlbums[i] = FacebookAlbum(
               jsonObject["id"], 
               jsonObject["name"], 
               jsonObject["location"], 
               jsonObject["count"], 
               jsonObject["link"] 
              ); 
     }); 
    }); 

    return dFacebookAlbums; 
} 

Respuesta

0

No he visto la API, pero dudo que FB te de cadenas JSON codificadas en una matriz. ¿Has intentado acceder a response.data [0] .someproperty?

+0

Sí, lo intenté pero también no se definió. Quiero analizar la cadena JSON devuelta. Devuelven JSON, creo ... bastante seguro. – PositiveGuy

+0

@coffeeaddict: Entonces 'alerta (response.data [0] .name);' no hace nada? No veo el ejemplo que vinculó para hacer un análisis sintáctico a mano, eso es manejado por la biblioteca API antes de que incluso llame a su devolución de llamada. –

+0

en realidad eso es exactamente lo mismo que probé ... nombre porque cada álbum tiene una propiedad de nombre. Pero déjame intentarlo una vez más. Voy a publicar mi análisis ... sucede después de esa alerta en mi ejemplo anterior, pero como me estoy volviendo indefinido porque probablemente no sé lo que estoy recibiendo o cómo usar ese objeto, mi análisis también falla con un indefinido – PositiveGuy

0

Si no hay ningún error, entonces response.data debería ser lo que desea (esto será una matriz en la mayoría de los casos) si está utilizando la nueva API api. Siempre puede alertar a la cadena JSON si no está seguro de lo que está recibiendo.

2

En general, JS SDK no devuelve el objeto JSON pero devuelve un objeto que está estructurado de forma similar al objeto JSON.

Digamos, por ejemplo: uno es un sondeo de datos de eventos del usuario y de acuerdo con la referencia GRAPH API (http://developers.facebook.com/docs/reference/api/event), los datos devueltos tendrán atributos como dados http://developers.facebook.com/docs/reference/api/event.

El objeto JSON para los datos de los eventos sería así si está usando PHP SDK

Array ([datos] => Array ([0] => Array ([nombre] => caso de la muestra [hora_inicial ] => 2010-08-09T22: 00: 00 + 0000 [end_time] => 2010-08-10T01: 00: 00 + 0000 [location] => at office \ [id] => xxxxxxxx [rsvp_status] => atendiendo)) [paginación] => array ([anterior] => hipervínculo [próximo] => hipervínculo))

Pero si está utilizando JS SDK, entonces la respuesta devuelta será así

response.data [0 ... n]. Atributos de la tabla particular a la que accede Ssing. Entonces, en el caso de la tabla de eventos será así:

response.data [0 ... n] .name o response.data [0 ... n] .id, response.data [0 ... n] .end_time, etc.

4

Depende de la API que se utilice. Para la nueva Graph API, los objetos individuales vuelven como objetos de nivel superior: http://graph.facebook.com/naitik - donde las colecciones vuelven con un nivel superior de datos propiedad que es Array: http://graph.facebook.com/zuck/feed. También hay una introspección para facilitar las cosas: http://developers.facebook.com/docs/api#introspection. FQL es la otra llamada API popular, y aquí es donde la respuesta de nivel superior es una matriz (filas de pensamiento en SQL) por lo que algunos ejemplos usan response[0]. Lo más fácil es simplemente mirar la respuesta en su navegador o mediante curl y ver cómo se ve.

1

¿Alguna vez se resolvió esto? Nadie aceptó nada.

alert("response[key]: " + response.data[i].Name); 

El código anterior tiene Name y no name. Además, como Matti señaló anteriormente, esto funciona:

response.data[0].name 

Sólo mis dos centavos. @CoffeeAddict, acepte las respuestas para mostrar un poco de aprecio ... Parece que alguien con su representante lo agradecería. : O)

3

sólo para aclarar para todos ustedes, amigos que son nuevos en FB.api (como yo) consultas gráfico devuelven diferentes datos de forma ... aquí hay dos ejemplos: FB.api('me/' function(returnData) { }) pondría los datos siguientes en returnData

{ 
    "id": "592529630", 
    "name": "Hugh Abbott", 
    "first_name": "Hugh", 
    "last_name": "Abbott", 
    } 

entonces si dijera returnData.first_name que obtendría "Hugh"

Sin embargo, si mi pregunta era acerca de mis amigos, que podría ejecutar la siguiente consulta FB.api('me/friends/' function(returnData) { }) Y la forma de mis datos es ahora diferente :

"data": [ 
    { 
     "name": "Tom Bell", 
     "id": "36801805" 
    }, 
    { 
     "name": "Michael Royce", 
     "id": "199712888" 
    }, 
] 

... así que returnData ahora es una matriz ... para recuperar valores, haría algo como lo siguiente.

returnData.data[0].name devolvería "Tom Bell"

espero que esta ayuda, ya que pasé un par de horas preguntándose dónde había salido mal ... resulta que todo está en la forma de los datos! !!! Buena suerte, amigos.

Hugh

0

estoy seguro de que esto no debe ser un problema más teniendo en cuenta la Graph API explorer muestra claramente los datos en la forma que se devuelve. Tiene razón acerca de la diferencia en la estructura de las respuestas, pero personalmente ha sido útil ver qué datos se devuelven utilizando el explorador y usar la sintaxis en consecuencia.

Cuestiones relacionadas