2012-04-03 20 views
6

EDITAR:entry.content.$t es el campo incorrecto para acceder a celdas individuales. entry.gsx $ [encabezado de columna de celda] es el método correcto. Disculpas y gracias por ayudar a resolver esto.Parse JSON de Google Spreadsheet

pregunta original:

estoy tratando de analizar JSON data from a Google Spreadsheet. El problema es que el campo de entradas devuelve una cadena que es una fila completa de la hoja de cálculo, pero aparece como un objeto mal formado. ¿Cómo están analizando otras personas esta información? Esto es lo que ve el nodo contenidos como:

"content": 
{ 
    "type" :"text", 
    "$t"  :"location: 780 Valencia St San Francisco, CA 94110, 
       phonenumber: (555) 555-5555, 
       website: http://www.780cafe.com, 
       latitude: 37.760505, 
       longitude: -122.421447" 
}, 

Mire cuidadosamente, el campo $t devuelve una cadena que es toda una fila en la hoja de cálculo de Google. Entonces, entry.content.$t devuelve una cadena: location: 780 Valencia St San Francisco, CA 94110, phonenumber: (555) 555-5555...

Además, este problema se agrava porque algunas de las celdas de la hoja de cálculo tienen comas (como direcciones) que no se escapan ni se citan. Algo así como

jQuery.parseJSON(entry.content.$t) 

o

eval('('+ entry.content.$t + ')') 

genera un error. Supongo que la expresión regular es una opción, pero espero que otros puedan haber resuelto esto de una manera más elegante. ¡Gracias por la ayuda!

+1

¿Cuál es la petición que se utiliza para obtener los datos JSON? ¿Utiliza celdas de tipo o lista de tipo? (Consulte http://code.google.com/apis/gdata/samples/spreadsheet_sample.html) – HBP

+1

Mirando los ejemplos más allá, creo que estás haciendo algo mal, ya sea en la forma en que estás solicitando el JSON o en los datos de la hoja de cálculo en sí. Por lo que puedo ver, no deberías recibir una fila completa como campo de texto; debería obtener una combinación de objetos y matrices en sus datos para denotar filas y columnas. –

+0

Doh! Me lo imaginé. Lo tienes. Estaba extrayendo el nodo equivocado. Aparentemente, devuelve objetos individuales para cada celda. Mi error. Muchas gracias por captar esto. – jrue

Respuesta

1

El "texto" dentro del atributo $t no es JSON. De acuerdo con la documentación, los nodos de texto se transfornan a los atributos $t, por lo que no se puede confiar en nada porque JSON esté formateado correctamente.

Sugeriría usar una expresión regular en su lugar, aunque le advertiré que analizar esa salida requerirá algunas cosas elegantes. Terminará usando una aserción ya que no puede dividir las comas; tendrá que buscar (\w+):, pero para encontrar el siguiente elemento, tendrá que llevar todo hasta otra coincidencia (\w+):, pero también no engullirlo Se puede hacer.

1

Recientemente, tuve el mismo problema.

para analizar el contenido de $ t, puede utilizar esta RegEx:

/(\w+): (.+?(?=(?:, \w+:|$)))/mgi 

volverá pares de clave-valor.

JavaScript ejemplo:

var currentPropertiesText = jsonEntry['content']['$t']; 

    // var propsArray = currentPropertiesText.split(", "); 
    var re = /(\w+): (.+?(?=(?:, \w+:|$)))/mgi; 
    var propsArray = re.exec(currentPropertiesText) 
    var props = {}; 

    while (propsArray != null) { 

     var propName = propsArray[1]; 
     var propValue = propsArray[2]; 

     props[propName] = propValue; 

     propsArray = re.exec(currentPropertiesText); 
    } 

Eso debería ayudar :-)