dedlfix: String in Array konvertieren

Beitrag lesen

Tach!

Beim Einlesen von JSON-Daten können Strings oder Arrays rauskommen:

[
	{
		"name": "John Doe",
		"telephone": "555 1234"
	},
	{
		"name": "Jane Roe",
		"telephone": ["555 1234", "555 9876"]
	}
]

Das lässt sich einfach korrigieren:

[
	{
		"name": "John Doe",
		"telephone": ["555 1234"]
	},
	{
		"name": "Jane Roe",
		"telephone": ["555 1234", "555 9876"]
	}
]

Nein, das widerspricht Postels Gesetz (Robustheitsgrundsatz).

{"telephone": "555 1234"} ist korrektes JSON. Es gibt keinen Grund, bei einer Telefonnummer eine Liste von Telefonnummern {"telephone": ["555 1234"]} zu notieren.

Ein einzelner String mit Trennzeichen darin ist auch korrektes JSON. Und trotzdem wird niemand auf die Idee kommen, das ebenfalls zuzulassen, wenn es dazu keinen besonderen Grund gibt.

Ebenso könntest du auch auf die Idee kommen, wenn nur ein Datensatz in der Menge ist, dass man da auch das äußere Array weglassen könnte. Sowas macht die Angelegenheit nur unnötig komplex, sowohl beim Auswerten als auch beim Formulieren der Schnittstellenbeschreibung.

Die Korrektur hat hier nicht in den Daten zu erfolgen, sondern im auswertenden Programm: “be liberal in what you accept.”

Der Herr Postel ist kein unumgängliches Gesetz formuliert, zu dem es keine Alternativen gibt. Der Abschnitt fängt an mit "TCP implementations should follow ...". Should, nicht must.

Auch hat so ein Grundsatz seine technischen Grenzen, weil irgendwann die Mehrdeutigkeit zu groß geworden ist. Systeme, die stillschweigend Korrekturen vornehmen, statt auf Probleme aufmerksam zu machen, sind auch nicht immer der Weisheit letzter Schluss.

Und wir sind hier nicht zwangsläufig in einem Umfeld, wo man sehr viele Implementationen aktueller und älterer Bauart zu berücksichtigen hat. Das ist erstmal ein konkret definiertes Datenformat. Wenn der Verwender das nicht korrekt implementiert, hat er keinen Anspruch darauf, dass sich andere Systeme ihn dann intentionsgemäß verstehen.

dedlfix.