![]() |
Wie aus diesem JSON object erstellen?
Der Titel ist recht allgemein, aber ich weiß nicht wirklich wie ich das betiteln soll.
Gegeben ist folgender JSON-String:
Code:
Im Grunde ist das ja ein Array. Das läßt sich in einer TList "TUsers" halten.
[
{ "id":1, "attributes":{ "notificationTokens":"bliblablup", //<----- "color.background":"#yellow" //<----- }, "name":"admin", "login":"", "email":"admin", }, { "id":4, "attributes":{ "notificationTokens":"bliblablup", //<----- "enabled":true //<----- }, "name":"user1", "login":"", "email":"user1@hotmail.de", }, { "id":5, "attributes":{ //<----- }, "name":"user2", "login":"", "email":"user2@hotmail.de", } ] Die Klassenstructur könnte so aussehen:
Delphi-Quellcode:
mein Problem sind die "attributes". Ich weiß nicht was ich da nehmen soll, beziehungsweise wie ich das geschickt parsen kann (idealerwiese sollte das in beide Richtungen gehen (JSON->Object und Object->json). Es können unterschiedliche Datentypen enthalten sein (Integer, string, boolean), unterschiedliche Anzahl der attributes oder auch leer, wie im Beispiel.
TUser=class
property id: Integer; property attributes: ??; //<--Hier weiß ich nicht was ich nehmen soll. property name: string; property login: string; proeprty email: string; end; Und es ist kein Array, sondern, wo wie ich das erkenne, nur ein Object. Wie könnt man das behandeln? Oder kann ich das nur zu Fuß machen. |
AW: Wie aus diesem JSON object erstellen?
Du hast dir deine Antwort doch schon selbst gegeben, es ist ein Objekt.
Die in der Delphi RTL vorhandene JSON-Serialisierung geht auf die Felder, nicht auf die Properties. Außerdem setzt sie zwingend voraus dass jeder Mensch die Namen der Felder immer mit einem F beginnt. Tust du das nicht, funktioniert es nicht. Oder man sagt explizit mit einem Attribut dass man es ernst meint.
Delphi-Quellcode:
unit Unit1;
interface uses Rest.JSON.Types; type TUserAttributes = class [JSONName('notificationTokens')] notificationTokens: String; [JSONName('color.background')] color_background: String; end; TUser = class [JSONName('id')] id: Integer; [JSONName('attributes')] attributes: TUserAttributes; [JSONName('name')] name: string; [JSONName('login')] login: string; [JSONName('email')] email: string; constructor Create(); destructor Destroy(); override; end; implementation constructor TUser.Create(); begin inherited; attributes := TUserAttributes.Create(); end; destructor TUser.Destroy(); begin attributes.Free(); inherited; end; end. Das lässt sich herrlich hin- und her konvertieren:
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} {$R *.res} uses System.JSON, Rest.Json, Unit1 in 'Unit1.pas'; const input = ' {'+ ' "id":1,'+ ' "attributes":{'+ ' "notificationTokens":"bliblablup",'+ ' "color.background":"#yellow"'+ ' },'+ ' "name":"admin",'+ ' "login":"",'+ ' "email":"admin"'+ ' }'; var user: TUser; asJsonObject: TJsonObject; begin user := TJson.JsonToObject<TUser>(input); asJsonObject := TJson.ObjectToJsonObject(user); WriteLn( TJson.Format(asJsonObject) ); readln; end. |
AW: Wie aus diesem JSON object erstellen?
ja, du hast recht. Aber vielleicht habe ich mich auch etwas unglücklich ausgedrückt. (Liegt mitunter an der Zeit, die man sich damit beschäftigt)
Ich könnte attributes zu einem einfachen Objekt machen. Nur leider ist das ein Art Property-List, die vom User beliebig erweitert werden kann. Heute steht da nur:
Code:
morgen kann es dann auch schon so aussehen.
"attributes":{
"notificationTokens":"bliblablup", "color.background":"#yellow" },
Code:
Klar kann ich nicht vorhandene Properties ignorieren und bei starrem Objectdesign neue Properties ignorieren. Aber das würde ich gerne nicht tun.
"attributes":{
"notificationTokens":"bliblablup", "color.background":"#yellow", "meineSchugroesse":42 }, |
AW: Wie aus diesem JSON object erstellen?
Dann mach doch TUserAttributes mit z.B. einer TStringList als Name-Value Storage und registriere einen eigenen Interceptor, der die Umwandlung aus JSON implementiert.
|
AW: Wie aus diesem JSON object erstellen?
Zitat:
|
AW: Wie aus diesem JSON object erstellen?
Okay, hab was gefunden "REST.Json.Interceptors.TArrayInterceptor"
Auf der Hilfeseite steht natürlich: "Embarcadero Technologies does not currently have any additional information." |
AW: Wie aus diesem JSON object erstellen?
Ich versuche auch seit 10 Minuten Doku zu finden wie man einen eigenen Converter/Reverter da reinschraubt, habe jetzt aber ehrlich gesagt auch aufgegeben. Es sollte gehen, aber ich wüsste spontan auch nicht wie.
|
AW: Wie aus diesem JSON object erstellen?
Vielleicht muss ich mir das mal näher ansehen: Synopse mORMot Framework
Ich hab da keinerlei Erfahrung mit. Aber vielleicht läßt es sich damit leichter umsetzen. Normalerweise verwende ich gerne Hausmittel, die, so Gott will, in späteren Version auch noch unterstützt werden. |
AW: Wie aus diesem JSON object erstellen?
Zitat:
![]() |
AW: Wie aus diesem JSON object erstellen?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
der Thread ist zwar schon sehr alt, aber ich versuche es trotzdem mal ob ich eine Antwort bekomme. Bei mir funktioniert das Beispiel von oben nicht. Ich bekommen immer die gleiche Fehlermeldung, siehe Anhang. Ich habe schon mehrere Beispiele probiert, auch von der Embarcadero-Seite probiert, immer das gleiche. ![]() Bin ziemlich an verzweifeln. Objekte zu JSON funktioniert. Vielleicht kann mir jemand helfen, was ich falsch mache. Gruß Stephan. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz