REST-Api: Problem beim Zurückgeben eines Artikels

Hallo, wir sind gerade dabei einen Artikel-Import/Export mit der Rest-Api zu programmieren. Direkt am Anfang ist eine Frage aufgetreten. Zum Test geben wir uns einfach den Artikel mit der ID “1” aus. Folgendes bekommen wir zurück. { "data": { "id": 1, "mainDetailId": 1, "supplierId": 17, "taxId": 1, "priceGroupId": 1, "filterGroupId": null, "configuratorSetId": null, "name": "JBL OnTime 200 P black", "description": " ", "descriptionLong": " iPod-Dock mit FM-Radio und Wecker 2x 6 Watt 3,5 mm Klinke hinterbeleuchtetes LCD-Display ", "added": "2009-12-15T00:00:00+01:00", "active": true, "pseudoSales": 0, "highlight": false, "keywords": null, "changed": "2012-11-26T10:14:00+01:00", "priceGroupActive": false, "lastStock": false, "crossBundleLook": 0, "notification": false, "template": "", "mode": 0, "availableFrom": null, "availableTo": null, "configuratorSet": null, "mainDetail": { "id": 1, "articleId": 1, "unitId": 9, "number": "125409", "supplierNumber": "OT-200PBLKE", "kind": 1, "additionalText": null, "active": 1, "inStock": null, "stockMin": null, "weight": "1.680", "width": null, "len": null, "height": null, "ean": null, "position": 0, "minPurchase": null, "purchaseSteps": null, "maxPurchase": null, "purchaseUnit": null, "referenceUnit": null, "packUnit": null, "shippingFree": false, "releaseDate": "2013-01-07T00:00:00+01:00", "shippingTime": "2", "prices": [{ "id": 1, "articleId": 1, "articleDetailsId": 1, "customerGroupKey": "EK", "from": 1, "to": "beliebig", "price": 167.98319327731, "pseudoPrice": null, "basePrice": null, "percent": null }], "attribute": { "id": 1, "articleId": 1, "articleDetailId": 1, "attr1": "Hersteller-Nr.: OT-200PBLKE", "attr2": "", "attr3": "", "attr4": "", "attr5": "", "attr6": "", "attr7": "", "attr8": "", "attr9": "", "attr10": "", "attr11": "", "attr12": "", "attr13": "", "attr14": "", "attr15": "", "attr16": "", "attr17": null, "attr18": "", "attr19": "", "attr20": "" } }, "tax": { "id": 1, "tax": "19.00", "name": "19%" }, "categories": { "11": { "id": 11, "name": "Soundstationen" } }, "links": [], "images": [{ "id": 1, "articleId": 1, "articleDetailId": null, "description": "", "path": "1\_c20f53e1f56b5dd53094e85cea1314f8", "main": 1, "position": 0, "width": 200, "height": 200, "relations": "", "extension": "jpg", "parentId": null, "mediaId": 1 }], "downloads": [], "related": [], "propertyValues": [], "similar": [], "customerGroups": [], "supplier": { "id": 17, "name": "JBL", "image": "", "link": "", "description": null }, "details": [], "propertyGroup": null }, "success": true } Die Fragen, die auftaucht, betrifft vor allem das Objekt “categories”. Objektname = Kategorie? Kann das richtig sein? In diesem Falle jetzt “11”. "categories": { "11": { "id": 11, "name": "Soundstationen" } Ich hoffe es ist verständlich, was gemeint ist. Vielleicht kann Jemand weiterhelfen. Schon mal vielen Dank!

Hallo, kannst du deine Frage noch klarer formulieren?

Hallo, diese Frage habe ich mir auch schon bei meinen ersten Gehversuchen mit der API gestellt. [quote]“categories”:{“5”:{“id”:5,“name”:“Pfeifen”},“6”:{“id”:6,“name”:“Tabak”}}[/quote] Da die Kategorie als Array verwendet wird, müsste es nach meiner Meinung eigentlich wie folgt heißen: [quote]“categories”:[{“id”:5,“name”:“Pfeifen”},{“id”:6,“name”:“Tabak”}][/quote]

Hallo Ewald, hallo Thomas, ok, die Beobachtung verstehe ich. Aber wo seht ihr jetzt das Problem? Das ist halt ein assoziatives Arrays, das in JSON in Objekt-Notation dargestellt wird. Wenn ihr das jetzt bspw. mit PHP verarbeitet, könnt ihr euch das ganz normal als verschachteltes Array ausgeben lassen und darüber iterieren - da ist es ja egal, wie JSON das zwischenzeitlich darstellt. Und die IDs als Key können ja abhängig vom konkreten Anwendungsfall durchaus hilfreich sein. Oder habe ich euch falsch verstanden? Ist das nur “Verwunderung” oder tatsächlich ein Problem? Schönen Gruß, Daniel

Hallo Daniel, ich bin gerade dabei für einen Kunden die Shopware-Anbindung an sein Warenwirtschaftssystem zu machen. Programmierung ist in VB.NET 2008. Ich nutze den DataContractJsonSerializer von VB. Und da bekomme ich derzeit die Kategorie-Daten des Artikels nicht zurück da der DataContractJsonSerializer assoziative Arrays nicht umsetzen kann (zumindest habe ich noch keine Lösung dafür). Erstellen eines Artikels funktioniert mit den Katagoriezuordnungen, da ich hier ein normales Array übergeben kann. Gruß Ewald

Hi Ewald, ok, dazu kann ich wenig sagen; grundsätzlich ist aber der gesamte Output als assoziatives Array aufgebaut, “mainDetail” oder “tax” ist ja nichts anderes. Warum kannst du das lesen und die Kategorien nicht? Die einzige Besonderheit bei den Kategorien ist ja, dass die Keys numerisch sind - aber das darf ja egtl. auch keine Probleme verursachen? lG Daniel

Folgendes vorweg: Ich kenne weder die API, noch habe ich Berührungspunkte mit VB. Ich stelle lediglich mal folgende Hypothese auf: VB wird sehr wohl in der Lage ist das Ganze als Objekt(!) deserialisieren zu können. Nun ist es allerdings nicht ganz so intuitiv über Objekteigenschaften (i.d.R. gibt’s sowas wie getProperties() auf jedem Objekt) zu iterieren, im Vergleich zu einem ordinären Array jedenfalls (oder einer Hashmap/eines Dictionaries, was aber auf Grund des Eingangsformats natürlich nicht seitens VB von einem Objekt unterschieden werden kann). Alle anderen Eigenschaften haben im Vergleich dazu immer fest definierte Eigenschaftsnamen, der Zugriff erfolgt darauf also immer fix. /** Vorsicht, jetzt folgt meine persönliche Meinung: **/ Von daher kann ich den Einwand schon verstehen, und meiner Meinung nach ist die Schnittstelle im Design an diesem Punkt schlecht gelöst (bzw. wurde über die Konsequenz nicht nachgedacht). Es ist nicht Aufgabe des Serialisierungsformates einen gesonderten Zugriff auf ein ihr dynamisches zugewiesenes Element bereitzustellen. Mit der gleichen Begründung müsste man dann je Eigenschaftswert ein assoziatives Array anbieten. Dass das Quatsch wäre, dürfte einleuchtend sein (hoffe ich). Möchte man im „Zielsystem“ eine Methode à la meinObjekt.categories.getCategoryById(), dann ist das Aufgabe der dortigen Schicht das bereitzustellen, nicht der des Serialisierungsformats einen Sonderfall zu behandeln.

[quote=“Daniel Nögel”]ok, dazu kann ich wenig sagen; grundsätzlich ist aber der gesamte Output als assoziatives Array aufgebaut, “mainDetail” oder “tax” ist ja nichts anderes. Warum kannst du das lesen und die Kategorien nicht? Die einzige Besonderheit bei den Kategorien ist ja, dass die Keys numerisch sind - aber das darf ja egtl. auch keine Probleme verursachen? [/quote] Hallo Daniel, das Problem liegt darin, daß der DataContractJsonSerializer ein Mapping nach den gefundenen Namen erzeugt. Ich habe ein Artikel-Objekt mit dem Namen “data”. Daher werden die Artikeleigenschaften aus dem Bereich “data” diesem Objekt zugeordnet. Bei “mainDetail” läuft das genauso (Objekt mit Namen “mainDetail” innerhalb des Artikelobjekts). Das funktioniert, da die Namen der erwarteten Objekte ja bekannt sind. Nur bei den Kategorien funktioniert so nicht mehr. Da müsste ich dazu für jede mögliche Id ein Objekt mit dem Namen/Nummer der Id angelegt haben. Mein Problem wäre gelöst, wenn die Kategorien als einfaches Array geliefert würden. Gruß Ewald

Hallo ovi, hi Ewald, ok, ich sehe das Problem. Ich bin bisher immer davon ausgegangen, dass man JSON eigentlich in jeder Sprache zumindest optional als assoziativen Arrays verarbeiten kann. Klar, wenn dynamisch Objekte mit numerischen (quasi-zufälligen) Indizes als Attribute erzeugt werden, kann man damit erstmal schlecht arbeiten. JSON selbst scheint in der Hinsicht auch eher undogmatisch zu sein (auch wenn das Ding ja “JavaScript Object Notion” heißt :)): [quote]JSON is built on two structures: A collection of name/value pairs. In various languages, this is realized as an object, record, struct, dictionary, hash table, keyed list, or associative array. An ordered list of values. In most languages, this is realized as an array, vector, list, or sequence.[/quote] Insofern die o.g. Datenstrukturen iterierbar sind, macht es natürlich erstmal keinen Unterschied, ob ob man jetzt den ersten oder zweiten Fall vor sich hat (etwa in der Ausgangssprache PHP). Bei Objekten sieht das Ganze schon anders aus, sehe ich ein. Ich stimme euch zu, dass es sicher wünschenswert/sinnvoll wäre, hier auch den Objekt-Fall abzudecken. Legt dazu einfach ein Ticket unter http://jira.shopware.de an, dann können wir das bei der weiteren Entwicklung prüfen. So wie ich das einschätze, spricht ja erstmal nichts dagegen (von einem kleinen API-Bruch abgesehen). Bis dahin würde ich aber schon empfehlen, nach einem Weg zu Suchen, das Ding als verschachteltes (assoziatives) Array zu verarbeiten, wir müssen das ja auch erstmal evaluieren und bspw. schauen, an welchen Stellen das Problem noch auftritt. Schönen Gruß, Daniel