2012-04-03 10 views
6

EDIT:entry.content.$t ist das falsche Feld für den Zugriff auf einzelne Zellen. entry.gsx $ [Zelle Spaltenkopf] ist die richtige Methode. Entschuldigung und vielen Dank für Ihre Hilfe.Parse JSON von Google Spreadsheet

Original Frage:

Ich versuche JSON data from a Google Spreadsheet zu analysieren. Das Problem ist, dass das Feld "entries" eine Zeichenfolge zurückgibt, die eine ganze Zeile der Tabelle darstellt, aber als ein fehlerhaftes Objekt angezeigt wird. Wie analysieren andere Leute diese Daten? Hier ist, was der Inhalt Knoten wie folgt aussieht:

"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" 
}, 

Schauen Sie genau hin, das $t Feld gibt eine ganze Zeichenfolge, die eine Zeile in der Google-Tabelle ist. So entry.content.$t gibt eine Zeichenfolge: location: 780 Valencia St San Francisco, CA 94110, phonenumber: (555) 555-5555...

Dieses Problem wird noch dadurch verschärft, dass einige der Zellen in der Tabelle Kommas (wie Adressen) haben, die nicht maskiert oder zitiert werden. So etwas wie

jQuery.parseJSON(entry.content.$t) 

oder

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

wirft einen Fehler. Ich denke, Regex ist eine Option, aber ich hoffe, dass andere dies auf elegantere Weise gelöst haben. Danke für die Hilfe!

+1

helfen sollte Was die Anfrage auf Sie verwenden, um die JSON-Daten zu bekommen? Verwenden Sie Zellen oder Typenliste? (siehe http://code.google.com/apis/gdata/samples/spreadsheet_sample.html) – HBP

+1

Wenn ich die Beispiele weiter betrachte, denke ich, dass Sie etwas falsch machen - entweder in der Art, wie Sie das JSON anfordern oder in den Daten der Tabellenkalkulation selbst. Von dem, was ich sehen kann, sollten Sie nicht eine ganze Zeile als ein Textfeld erhalten; Sie sollten eine Kombination aus Objekten und Arrays in Ihren Daten erhalten, um Zeilen und Spalten zu kennzeichnen. –

+0

Doh! Ich habe es herausgefunden. Du hast es. Ich habe den falschen Knoten extrahiert. Offensichtlich gibt es einzelne Objekte für jede Zelle zurück. Mein Fehler. Danken Sie so viel dafür, das zu fangen. – jrue

Antwort

1

Der "Text" innerhalb des $t Attributs ist nicht JSON. Laut der Dokumentation werden Textknoten in $t Attribute übertragen, so dass Sie sich nicht darauf verlassen können, dass JSON richtig formatiert ist.

Ich würde vorschlagen, stattdessen einen regulären Ausdruck verwenden, obwohl ich Sie warnen, dass zum Parsen dieser Ausgabe einige ausgefallene Sachen benötigen. Sie werden am Ende eine Assertion verwenden, da Sie nicht über Kommas trennen können - Sie müssen nach (\w+): suchen, aber um das nächste Element zu finden, müssen Sie alles bis zu einem anderen passenden (\w+): aufnehmen, aber auch verschlingt es nicht. Es kann getan werden.

1

Erst vor kurzem hatte ich das gleiche Problem.

Zum Inhalt $ t analysieren, können Sie diese RegEx verwenden:

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

es Paare von Schlüssel-Wert zurück.

JavaScript-Beispiel:

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

Das :-)