expertenaustausch > comp.lang.* > comp.lang.python

Thomas Güttler (29.11.2018, 17:36)
Hat jemand schon mal mit binären Daten in JSON gearbeitet?

Welche Lösungsvariante habt ihr gewählt?

V1:
V2:
V3:
V4: ....

Gruß,
Thomas
Thomas Orgelmacher (29.11.2018, 19:19)
Am 29.11.18 um 16:36 schrieb Thomas Güttler:
> Hat jemand schon mal mit binären Daten in JSON gearbeitet?
> Welche Lösungsvariante habt ihr gewählt?
> V1:
> V2:
> V3:
> V4: ....


base64?

Gruß, Thomas
Arnold Krille (29.11.2018, 20:46)
On Thu, 29 Nov 2018 18:19:45 +0100 Thomas Orgelmacher <trash>
wrote:
> Am 29.11.18 um 16:36 schrieb Thomas Güttler:
> base64?


+1

Hihi, ich hab mal in einer Firma gearbeitet, da wurde zwischen Ruby und
Python kommuniziert indem Binär in Base64 in Yaml in ASN.1 in ZeroMQ
gemacht wurde;-) Historisch gewuchert halt.
Thomas Güttler (30.11.2018, 10:48)
Am 29.11.18 um 18:19 schrieb Thomas Orgelmacher:
> Am 29.11.18 um 16:36 schrieb Thomas Güttler:
> base64?


Autofahrer an Polizist: Kann ich hier wenden?
Polizist an Autofahrer: Sie dürfen, wenn Sie es können.

Also wie ist das mit base64 gemeint? Wie ist das JSON ähnliches Datenformat,
welches auch binäre Daten übertragen kann?

Ich suche eine Lösung. Ein Datenformat. Ich suche nicht ein gebasteltes Work-around.

Gruß,
Thomas
Stefan Schwarzer (30.11.2018, 12:27)
Hallo Thomas,

On 30/11/2018 09:48, Thomas Güttler wrote:
> Am 29.11.18 um 18:19 schrieb Thomas Orgelmacher:
> Autofahrer an Polizist: Kann ich hier wenden?
> Polizist an Autofahrer: Sie dürfen, wenn Sie es können.
> Also wie ist das mit base64 gemeint? Wie ist das JSON ähnliches Datenformat,
> welches auch binäre Daten übertragen kann?
> Ich suche eine Lösung. Ein Datenformat. Ich suche nicht ein gebasteltes Work-around.


Deine Frage war "Hat jemand schon mal mit binären
Daten in JSON gearbeitet?"

Wenn man sich die von dir genannten Links nicht oder
nur flüchtig angeschaut hat, kann man deine Frage auch
durchaus so interpretieren, dass du binäre Daten
innerhalb von JSON übertragen willst.

Zu "Ich suche eine Lösung": Wir wissen ja gar nicht,
was dein konkretes Problem ist, außer "mit binären
Daten in JSON arbeiten."

Viele Grüße
Stefan
Hardy Erlinger (30.11.2018, 12:40)
On 30.11.2018 11:27, Stefan Schwarzer wrote:
> Hallo Thomas,
> On 30/11/2018 09:48, Thomas Güttler wrote:
> Zu "Ich suche eine Lösung": Wir wissen ja gar nicht,
> was dein konkretes Problem ist, außer "mit binären
> Daten in JSON arbeiten."

Exakt. Base64 ist kein Workaround. Damit kannst Du ganz ohne externe
Libraries binäre Daten in JSON-Feldern serialisieren. Beispiel:

person = {
    'name': 'Luke Skywalker',
}
pic_content = pathlib.Path(pic_path).read_bytes()
person['picture'] = base64.encodebytes(pic_content).decode('ascii')

Das dict kann nun problemlos mit json.dumps() serialisiert werden. Das
'picture'-Attribut ist reines ASCII. Es muss kein neues Binärformat
eingeführt werden, beim Tracen der Messages zwischen Client und Server
ist alles weiterhin JSON und damit sehr gut lesbar etc. etc.

Viele Grüße,
Hardy
Thomas Güttler (30.11.2018, 16:01)
Am 30.11.18 um 11:27 schrieb Stefan Schwarzer:
[..]
> Zu "Ich suche eine Lösung": Wir wissen ja gar nicht,
> was dein konkretes Problem ist, außer "mit binären
> Daten in JSON arbeiten."


Ja, sorry. Ich bin hier etwas genervt, weil die Grundlagen nicht klar sind.
JSON kann jeder. Aber binäre Daten darin zu übertragen geht leider nicht.
Mit base64 benötigt es einer expliziten Absprache und darum ist
es aus meiner Sicht ein work-around. Vermutlich wird es das werden.
Es kommt darauf an, was der Empfänger der Daten kann. Ich vermute
MessagePack werden die vermutlich nicht können. Aber vielleicht liege ich da auch falsch.

Ich finde es immer super, wenn es einen klaren Weg gibt. Also eine Art world-wide-agreement.
Wie bei zB JSON. Aber bis jetzt gibt es das hier noch nicht.

Gruß,
Thomas
Thomas Orgelmacher (30.11.2018, 20:24)
Am 30.11.18 um 09:48 schrieb Thomas Güttler:
> Am 29.11.18 um 18:19 schrieb Thomas Orgelmacher:
>> base64?

> Autofahrer an Polizist: Kann ich hier wenden?
> Polizist an Autofahrer: Sie dürfen, wenn Sie es können.
> Also wie ist das mit base64 gemeint? Wie ist das JSON ähnliches Datenformat,
> welches auch binäre Daten übertragen kann?


Hättest Du es Dir angeschaut, wäre es klar gewesen.

Du kodierst Deine binären Daten mit base64 und packst sie dann in
einen JSON-String. Fertig. Und keine zusätzlichen Abhängigkeiten.

Gruß, Thomas
Thomas Orgelmacher (30.11.2018, 20:37)
XDR wäre auch noch eine Möglichkeit.



Gruß, Thomas
Thomas Jollans (03.12.2018, 11:21)
On 30/11/2018 15:01, Thomas Güttler wrote:
> Ja, sorry. Ich bin hier etwas genervt, weil die Grundlagen nicht klar sind.
> JSON kann jeder. Aber binäre Daten darin zu übertragen geht leider nicht.
> Mit base64 benötigt es einer expliziten Absprache und darum ist
> es aus meiner Sicht ein work-around. Vermutlich wird es das werden.
> Es kommt darauf an, was der Empfänger der Daten kann. Ich vermute
> MessagePack werden die vermutlich nicht können. Aber vielleicht liege
> ich da auch falsch.


Base64 kann auch jeder, und die Absprache brauchst Du eh: ein
JSON-Datensatz ist schön und gut, man muss aber immer wissen, wie ein
bestimmtes JSON zu interpretieren ist. Was bedeuten die Felder? Ist ein
String eine URL, eine interne ID, ein Titel, eine Nachricht, oder was?
Je nachdem wie der Datensatz aufgebaut ist, kannst Du solche Sachen als
Mensch wahrscheinlich erraten, aber als Mensch kannst Du auch Base64
erkennen.

Je nachdem was Du überträgst, könntest Du auch Data-URIs in dem JSON
einbetten (? die dann wiederum Base64 für Binärdaten benutzen). Da ist
dann auch ein MIME-Typ drin.

Gruß
Thomas
[..]
Thomas Güttler (04.12.2018, 11:25)
Am 03.12.18 um 10:21 schrieb Thomas Jollans:
> On 30/11/2018 15:01, Thomas Güttler wrote:
> Base64 kann auch jeder, und die Absprache brauchst Du eh: ein
> JSON-Datensatz ist schön und gut, man muss aber immer wissen, wie ein
> bestimmtes JSON zu interpretieren ist.


In diesem konkreten Fall reiche ich die Daten einfach durch.
Ich erhalte per SAP-RFC eine Datenstruktur und geben diese als JSON
aus. SAP-RFC kann mit binären Daten umgehen. Schön wäre eine generische Lösung.
Die scheitert gerade daran, dass man dann wieder programmieren muss:

"if blablabla, dann die Daten erst noch per base64 verwurschteln ..."

Wäre wirklich super, wenn ich meinem Kunden sagen könnte:

Wir nehmen JSON++ (gibt es nicht, der Name ist erfunden) und fertig.

> Je nachdem was Du überträgst, könntest Du auch Data-URIs in dem JSON
> einbetten (? die dann wiederum Base64 für Binärdaten benutzen). Da ist
> dann auch ein MIME-Typ drin.


Es gibt tausend work-Arounds (wie zb base64 selber erstellen) und
hundert alternative JSON-Formate.

In zehn Jahren werden wir wissen welches Format das Rennen gemacht hat.

Aktuell ist das für mich noch nicht abzusehen.

Gruß,
Thomas
Stefan Behnel (06.12.2018, 10:51)
Thomas Güttler schrieb am 04.12.18 um 10:25:
> Es gibt tausend work-Arounds (wie zb base64 selber erstellen) und
> hundert alternative JSON-Formate.
> In zehn Jahren werden wir wissen welches Format das Rennen gemacht hat.
> Aktuell ist das für mich noch nicht abzusehen.


So ist das halt, wenn jemand ein neues Datenformat erfindet, das "total
viel einfacher" als alles andere ist, und sich dann herausstellt, dass es
nur deshalb "total viel einfacher" ist, weil alles, was die anderen Formate
halt mit der Zeit an notwendigen Features entwickelt haben, auch deren
Komplexität erhöht hat. Also wird noch schnell alles an Features
drangeklatsch, was die anderen Formate schon haben, und ? hoppsa ? schon
brauchen wir ein neues Datenformat, das endlich alles "total viel
einfacher" macht.



Stefan
Stefan Ram (07.12.2018, 03:08)
=?UTF-8?Q?Thomas_G=c3=bcttler?= <guettliml> writes:
>"if blablabla, dann die Daten erst noch per base64 verwurschteln ..."


Du kannst ja einfach /alle/ Daten (auch die Textdaten)
base64-kodieren. Dann brauchst Du kein "if".

>Wäre wirklich super, wenn ich meinem Kunden sagen könnte:
>Wir nehmen JSON++ (gibt es nicht, der Name ist erfunden) und fertig.


Dann nenne das Verfahren, bei dem alle Daten base64-kodiert
werden, "JSON64".
Thomas Güttler (13.12.2018, 13:14)
Am 07.12.18 um 02:08 schrieb Stefan Ram:
> =?UTF-8?Q?Thomas_G=c3=bcttler?= <guettliml> writes:
> Du kannst ja einfach /alle/ Daten (auch die Textdaten)
> base64-kodieren. Dann brauchst Du kein "if".
> Dann nenne das Verfahren, bei dem alle Daten base64-kodiert
> werden, "JSON64".


Ich suche nach einem Datenformat, dass mehr oder weniger etabliert ist.
Stefan Ram (13.12.2018, 17:06)
=?UTF-8?Q?Thomas_G=c3=bcttler?= <guettliml> writes:
>Am 07.12.18 um 02:08 schrieb Stefan Ram:
>Ich suche nach einem Datenformat, dass mehr oder weniger etabliert ist.


Dann nimm doch IFF. Das wird sogar mit dem Modul "chunk.py"
schon von der Python-Standardbibliothek unterstützt.

|23.5 chunk ? Read IFF chunked data
|Source code: Lib/chunk.py
|This module provides an interface for reading
|files that use EA IFF 85 chunks.

IFF - etabliert seit 1985.

Ähnliche Themen