AGB  ·  Datenschutz  ·  Impressum  







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

JSON Parsen

Ein Thema von franktron · begonnen am 17. Mär 2016 · letzter Beitrag vom 21. Mär 2016
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: JSON Parsen

  Alt 17. Mär 2016, 15:19
Mal eben so heruntergetippt ...
Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.Json,
  System.SysUtils;

function IsEven( const Value: Integer ): Boolean;
begin
  Result := Value mod 2 = 0;
end;

function ParseSingleExpression( AJsonArray: TJsonArray ): string;
var
  lInner : TJsonArray;
  lFieldName: string;
  lOperator : string;
  lValue : string;
begin
  if AJsonArray.Count <> 1
  then
    raise EArgumentException.Create( 'single item in array expected' );

  if not( AJsonArray.Items[ 0 ] is TJsonArray )
  then
    raise EArgumentException.Create( 'array expected' );

  lInner := AJsonArray.Items[ 0 ] as TJsonArray;

  if lInner.Count <> 3
  then
    raise EArgumentException.Create( 'three items expected' );

  if not( lInner.Items[ 0 ] is TJSONString )
  then
    raise EArgumentException.Create( 'string expected' );
  lFieldName := lInner.Items[ 0 ].Value;

  if not( lInner.Items[ 1 ] is TJSONString )
  then
    raise EArgumentException.Create( 'string expected' );
  lOperator := lInner.Items[ 1 ].Value;

  if lInner.Items[ 2 ] is TJSONString
  then
    lValue := QuotedStr( lInner.Items[ 2 ].Value )
  else
    lValue := lInner.Items[ 2 ].Value;

  Result := string.Format( '(%s %s %s)', [ lFieldName, lOperator, lValue ] );
end;

function ParseJsonExpression( AJsonArray: TJsonArray ): string;
overload
var
  I: Integer;
begin
  if IsEven( AJsonArray.Count )
  then
    raise EArgumentException.Create( 'odd items in array expected' );

  if AJsonArray.Count = 1
  then
    Result := ParseSingleExpression( AJsonArray )
  else
    begin
      Result := '( ';
      for I := 0 to AJsonArray.Count - 1 do
        begin
          if I mod 2 = 0
          then
            if AJsonArray.Items[ I ] is TJsonArray
            then
              Result := Result + ParseJsonExpression( AJsonArray.Items[ I ] as TJsonArray )
            else
              raise EArgumentException.Create( 'Array expected' )
          else
            Result := Result + ' ' + AJsonArray.Items[ I ].Value + ' ';
        end;
      Result := Result + ' )';
    end;
end;

function ParseJsonExpression( AJsonStr: string ): string; overload;
var
  lValue: TJSONValue;
begin
  lValue := TJSONObject.ParseJSONValue( AJsonStr );
  try
    if lValue is TJsonArray
    then
      Result := ParseJsonExpression( lValue as TJsonArray )
    else
      raise EArgumentException.Create( 'Fehlermeldung' );
  finally
    lValue.Free;
  end;
end;

const
  Data1 = '[["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]]';
  Data2 = '[[["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]],"and",[["charge","=","11"]]]';
  Data3 = '[[["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]],"and",[["charge","=","11"]],"and",[[["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]],"and",[["charge","=","11"]]]]';

procedure Main;
begin
  WriteLn( Data1 );
  WriteLn( ParseJsonExpression( Data1 ) );
  WriteLn;
  WriteLn( Data2 );
  WriteLn( ParseJsonExpression( Data2 ) );
  WriteLn;
  WriteLn( Data3 );
  WriteLn( ParseJsonExpression( Data3 ) );
end;

begin
  try
    Main( );
  except
    on E: Exception do
      WriteLn( E.ClassName, ': ', E.Message );
  end;
  ReadLn;

end.
und liefert
Code:
[["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]]
(Bezeichnung = 'Angussstutzen-Rev/B-PPTV30')

[[["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]],"and",[["charge","=","11"]]]
( (Bezeichnung = 'Angussstutzen-Rev/B-PPTV30') and (charge = '11') )

[[["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]],"and",[["charge","=","11"]],"and",[[["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]],"and",[["charge","=","11"]]]]
( (Bezeichnung = 'Angussstutzen-Rev/B-PPTV30') and (charge = '11') and ( (Bezeichnung = 'Angussstutzen-Rev/B-PPTV30') and (charge = '11') ) )
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (17. Mär 2016 um 15:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.811 Beiträge
 
Delphi 12 Athens
 
#2

AW: JSON Parsen

  Alt 18. Mär 2016, 10:17
Sorry4OT: So viel zum Thema "JSON ist sooo einfach" XML hat halt etwas mehr overhead, aber einfacher als JSON ist es allemal.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
franktron

Registriert seit: 11. Nov 2003
Ort: Oldenburg
1.446 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: JSON Parsen

  Alt 18. Mär 2016, 10:21
Sorry4OT: So viel zum Thema "JSON ist sooo einfach" XML hat halt etwas mehr overhead, aber einfacher als JSON ist es allemal.

Sherlock
Ja aber mit Javascript ist nun mal alles JSON.

Ich habe es jetzt gelöst etwas Krank aber es geht,
ich habe den String in ein Array zerlegt.
Frank
Tux sein Lieblingsquellcode
While anzfische<TuxSatt do begin
Fisch:=TFisch.Create; Tux.EssenFisch(Fisch); Fisch.Free;inc(anzfische); end;
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#4

AW: JSON Parsen

  Alt 18. Mär 2016, 10:29
So viel zum Thema "JSON ist sooo einfach" XML hat halt etwas mehr overhead, aber einfacher als JSON ist es allemal.
Tut mir leid, aber da muss ich dir etwas OT widersprechen.

Wenn diese spezielle Syntax nicht so aufgebläht wäre und man die zu Verfügung stehenden Datentypen benutzen würde, wäre JSON deutlich einfacher. Hier sind allerdings unnötig verschachtelte Klammern und es werden nur Arrays statt Objekte verwendet. Ein tolles Beispiel für ziemlich schlechte Verwendung von JSON.

Mein Vorschlag für Variante 2 aus #4:

Code:
{
    "left": {
       "left": "Bezeichnung",
       "op": "=",
       "right": "Angussstutzen-Rev/B-PPTV30"
    },
    "op": "and",
    "right": {
        "left": "charge",
        "op": "=",
        "right": "11"
    }
}
Vorteile:
  • Keine unnötige Verschachtelung
  • Dank Objects keine ungültige Syntax möglich (z.B. "A, =, B, C")
  • Einfach lesbar und rekursiv zu verarbeiten
  • Klare und logische Verwendung von Datentypen
    • Objekte sind Ausdrücke
    • Strings entsprechen je nach Kontext Bezeichnern, Werten oder Operationen
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: JSON Parsen

  Alt 19. Mär 2016, 09:40
Sorry4OT: So viel zum Thema "JSON ist sooo einfach" XML hat halt etwas mehr overhead, aber einfacher als JSON ist es allemal.

Sherlock
Nunja wenn ich mir die XML-Sourcen anschaue, die bei Windows mitgeliefert werden, kräuseln sich mir die Fußnägel. Ich mußte einen ganzen Satz von abhängigen Parametern (u.a. SQL-Sourcen Array of record ...) ablegen. Das ging mit JSON wesentlich eleganter als mit XML. Wobei die Lesbarkeit der verschiedenen Sourcen nicht für JSON spricht.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.643 Beiträge
 
#6

AW: JSON Parsen

  Alt 19. Mär 2016, 14:57
Laut dem Titel geht es hier um C#.
Und da gibts mit Newtonsoft.JSON ein Library das das komplett übernimmt.

man schmeisst das Json da nur rein und bekommt ein deserialisiertes Objekt zurück mit dem man weiter arbeiten kann.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
madas

Registriert seit: 9. Aug 2007
207 Beiträge
 
#7

AW: JSON Parsen

  Alt 20. Mär 2016, 13:21
Laut dem Titel geht es hier um C#.
Und da gibts mit Newtonsoft.JSON ein Library das das komplett übernimmt.

man schmeisst das Json da nur rein und bekommt ein deserialisiertes Objekt zurück mit dem man weiter arbeiten kann.
Und selbst für Delphi gibt es superobject. Verstehe nicht, was man da doch selber parsen möchte.

Madas
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: JSON Parsen

  Alt 21. Mär 2016, 11:51
Zumindest "Lesen können" ist doch recht hilfreich bei der Fehlersuche.
(Das ist nichts gegen Superobject gesagt!!)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:41 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-2025 by Thomas Breitkreuz