AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie aus diesem JSON object erstellen?

Ein Thema von Hobbycoder · begonnen am 14. Mai 2020 · letzter Beitrag vom 15. Jul 2021
Antwort Antwort
Seite 1 von 2  1 2      
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#1

Wie aus diesem JSON object erstellen?

  Alt 14. Mai 2020, 09:11
Der Titel ist recht allgemein, aber ich weiß nicht wirklich wie ich das betiteln soll.

Gegeben ist folgender JSON-String:
Code:
[
   {
      "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",
   }
]
Im Grunde ist das ja ein Array. Das läßt sich in einer TList "TUsers" halten.
Die Klassenstructur könnte so aussehen:
Delphi-Quellcode:
  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;
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.
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.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.

Geändert von Hobbycoder (14. Mai 2020 um 09:24 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.160 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Wie aus diesem JSON object erstellen?

  Alt 14. Mai 2020, 09:28
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.

Geändert von Der schöne Günther (14. Mai 2020 um 09:32 Uhr)
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#3

AW: Wie aus diesem JSON object erstellen?

  Alt 14. Mai 2020, 09:37
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:
      "attributes":{
         "notificationTokens":"bliblablup",
         "color.background":"#yellow"      
      },
morgen kann es dann auch schon so aussehen.
Code:
      "attributes":{
         "notificationTokens":"bliblablup",
         "color.background":"#yellow",    
         "meineSchugroesse":42
      },
Klar kann ich nicht vorhandene Properties ignorieren und bei starrem Objectdesign neue Properties ignorieren. Aber das würde ich gerne nicht tun.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.462 Beiträge
 
Delphi 12 Athens
 
#4

AW: Wie aus diesem JSON object erstellen?

  Alt 14. Mai 2020, 09:41
Dann mach doch TUserAttributes mit z.B. einer TStringList als Name-Value Storage und registriere einen eigenen Interceptor, der die Umwandlung aus JSON implementiert.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#5

AW: Wie aus diesem JSON object erstellen?

  Alt 14. Mai 2020, 09:43
Dann mach doch TUserAttributes mit z.B. einer TStringList als Name-Value Storage und registriere einen eigenen Interceptor, der die Umwandlung aus JSON implementiert.
Tolle Idee. Hab ich noch nie was von gehört. Wie geht denn sowas?
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#6

AW: Wie aus diesem JSON object erstellen?

  Alt 14. Mai 2020, 09:45
Okay, hab was gefunden "REST.Json.Interceptors.TArrayInterceptor"

Auf der Hilfeseite steht natürlich: "Embarcadero Technologies does not currently have any additional information."
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.160 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Wie aus diesem JSON object erstellen?

  Alt 14. Mai 2020, 09:51
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.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#8

AW: Wie aus diesem JSON object erstellen?

  Alt 14. Mai 2020, 09:56
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.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.462 Beiträge
 
Delphi 12 Athens
 
#9

AW: Wie aus diesem JSON object erstellen?

  Alt 14. Mai 2020, 10:13
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.
Guckst du hier: Serializing Objects with TJson
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
stephancramer

Registriert seit: 26. Apr 2016
14 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Wie aus diesem JSON object erstellen?

  Alt 15. Jul 2021, 08:26
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.
http://docwiki.embarcadero.com/RADSt...nutzerobjekten

Bin ziemlich an verzweifeln. Objekte zu JSON funktioniert.
Vielleicht kann mir jemand helfen, was ich falsch mache.

Gruß Stephan.
Miniaturansicht angehängter Grafiken
fehlermeldung.jpg  
Stephan Cramer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz