JSON != JSON?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
Whitie
User
Beiträge: 217
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Hallo Leute,
entschuldigt den Titel, mir ist nichts Anderes eingefallen. Folgender Ausschnitt soll eine eBay Abfrage durchführen. Wenn ich nun das JSON als Zeichenkette im Text habe, funktioniert es. Erzeuge ich die Zeichenkette mit json.dumps, kommt ein 500er HTTP error zurück.

Vielleicht stehe ich total auf dem Schlauch, aber wo ist der Unterschied (außer ein paar Leerzeichen)?

Code: Alles auswählen

# -*- coding: utf-8 -*-

import json
import urllib2

url = 'http://svcs.ebay.com/services/search/FindingService/v1'

headers = {
    'X-EBAY-SOA-SERVICE-NAME': 'FindingService',
    'X-EBAY-SOA-OPERATION-NAME': 'findItemsByKeywords',
    'X-EBAY-SOA-SERVICE-VERSION': '1.1.0',
    'X-EBAY-SOA-GLOBAL-ID': 'EBAY-DE',
    'X-EBAY-SOA-SECURITY-APPNAME': 'MyAppID', # Echte ID einsetzen
    'X-EBAY-SOA-REQUEST-DATA-FORMAT': 'JSON',
    'X-EBAY-SOA-RESPONSE-DATA-FORMAT': 'JSON',
}

raw_data = {
    "jsonns.xsi": "http://www.w3.org/2001/XMLSchema-instance",
    "jsonns.xs": "http://www.w3.org/2001/XMLSchema",
    "jsonns.tns": "http://www.ebay.com/marketplace/search/v1/services",
    "tns.findItemsByKeywordsRequest": {
        "keywords": "harry potter +dvd"
    }
}

data = json.dumps(raw_data)

s = ('{"jsonns.xsi":"http://www.w3.org/2001/XMLSchema-instance",'
     '"jsonns.xs": "http://www.w3.org/2001/XMLSchema",'
     '"jsonns.tns": "http://www.ebay.com/marketplace/search/v1/services",'
     '"tns.findItemsByKeywordsRequest": {'
        '"keywords": "harry potter +dvd"}}')

print repr(data)
print repr(s)

# Funktioniert
req = urllib2.Request(url, data=s, headers=headers)

# Funktioniert nicht
req = urllib2.Request(url, data=data, headers=headers)

sock = urllib2.urlopen(req)
res = sock.read()
sock.close()

print json.loads(res)
Kann man leider nur testen, wenn man im eBay Developer Program angemeldet ist.

Gruß
Whitie
Benutzeravatar
Whitie
User
Beiträge: 217
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Hi nochmal,
das Schreiben des obigen Beitrags hat mich selbst auf die Lösung gebracht. Man muss json.dumps mindestens ein indent=0 mitgeben. Die ganz kompakte Form scheint eBay also nicht zu mögen. Hat mich jetzt aber schon etwas länger beschäftigt :-(

Gruß
Whitie
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Whitie hat geschrieben:Hi nochmal,
das Schreiben des obigen Beitrags hat mich selbst auf die Lösung gebracht. Man muss json.dumps mindestens ein indent=0 mitgeben. Die ganz kompakte Form scheint eBay also nicht zu mögen. Hat mich jetzt aber schon etwas länger beschäftigt :-(

Gruß
Whitie
Dann scheint aber die Schnittstelle von Ebay schlecht gemacht zu sein (oder schlecht dokumentiert).
Benutzeravatar
Whitie
User
Beiträge: 217
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Dokumentation zu JSON gibt es fast gar nicht. Kommt vielleicht noch. Ich möchte es trotzdem benutzen, da es von Python aus das eleganteste ist (meine Meinung). Beim dritten hinschauen frage ich mich auch, was der Unterschied zwichen json.dumps(..., indent=None) und meinem handgeschriebenen String ist. Hat der nicht die kompakteste Form?

Gruß
Whitie
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Die passende Dokumentation von ebay ist wohl wahrscheinlich http://developer.ebay.com/DevZone/findi ... jsonsyntax . Da bezieht man sich auf RFC 4627 und wenn sie nicht in der Lage sind, ein IMHO korrektes JSON-Dokument zu parsen, dann sollte man da mal nachfragen und um Klarstellung bitten. Das es nur geht, wenn Zeilenumbrüche enthalten sind, kommt mir sehr komisch vor.

Ich würde ja darauf tippen, dass da jemand einen JSON-Parser in einer Sprache zusammengefrickelt hat, die mit Speicherüberläufen in Datenstrukturen zu kämpfen hat, sie aber gleichzeitig so einen Request zeilenweise lesen. Das wäre dann sehr amateurhaft.

Stefan
BlackJack

Oder sie gehören zu den Leuten die alles mit regulären Ausdrücken parsen und nicht damit gerechnet haben, dass auch alles in einer Zeile stehen kann.
Benutzeravatar
Whitie
User
Beiträge: 217
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

BlackJack hat geschrieben:Oder sie gehören zu den Leuten die alles mit regulären Ausdrücken parsen und nicht damit gerechnet haben, dass auch alles in einer Zeile stehen kann.
Allerdings funktioniert ja mein String. Der wird doch auch zu einer langen Zeile, oder? Ich werde mal eine Mail an eBay schicken und dann hier berichten.

Gruß
Whitie
Antworten