Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zeichenkette zerlegen... (https://www.delphipraxis.net/160065-zeichenkette-zerlegen.html)

delphinia 26. Apr 2011 10:36

Delphi-Version: 5

Zeichenkette zerlegen...
 
Hallo ihr Lieben,

ich habe eine Webseite die einen Rückgabewert aus einer Ajax Abfrage wiedergibt, die wie folgt ausschaut!

Code:
{
   "ResultData":
      [
         {"PostId":"421386","data":{"PostId":"421386","title":"Mein Title"}},
         {"PostId":"421386","data":{"PostId":"421386","title":"Mein Title"}},
         {"PostId":"421386","data":{"PostId":"421386","title":"Mein Title"}},
         {"PostId":"421386","data":{"PostId":"421386","title":"Mein Title"}}
      ]
}
Wie könnte ich das ab besten zuverlässig sauber in ein Array oder in was auch immer zerlegen, damit ich auf die einzelnen Werte Zugriff bekomme?!


Danke Euch für Eure Tipps....

Zacherl 26. Apr 2011 10:44

AW: Zeichenkette zerlegen...
 
Als Container einfach ein solches Array:

Delphi-Quellcode:
type
  MyRecord = record
    Id: Integer;
    Title: String;

var
  MyArray = array of MyRecord;
Und parsen kannst du die Rückgabe eigentlich recht einfach mit Pos(), Copy(), Delete() und einer schönen Schleife :)

Deep-Sea 26. Apr 2011 10:54

AW: Zeichenkette zerlegen...
 
Das Format was du da hast nennt sich JSON. Also bietet sich da ein JSON-Parser an :wink:

delphinia 26. Apr 2011 10:57

AW: Zeichenkette zerlegen...
 
ahhh hey super danke - wusste ich nicht das es dafür sogar einen namen gibt!

THANKS! Werde nun sicher weiterkommen - :thumb:

schlecki 26. Apr 2011 10:58

AW: Zeichenkette zerlegen...
 
konkret kann ich da SuperObject empfehlen. Sehr einfaches Handling, ermöglicht einfachstes Einlesen, Bearbeiten und Speichern von JSON-Daten.

himitsu 26. Apr 2011 12:18

AW: Zeichenkette zerlegen...
 
In "neueren" Delphis wäre eine JSON-Implementation schon vorhanden.

Ich weiß nur nicht seit wann es das gibt, da sowas in der OH nie erwähnt wird. :wall:
Aber im D5 des TE wird's das vernutlich noch nicht geben. :oops:

Deep-Sea 26. Apr 2011 12:28

AW: Zeichenkette zerlegen...
 
Zitat:

Zitat von himitsu (Beitrag 1096980)
In "neueren" Delphis wäre eine JSON-Implementation schon vorhanden.

Oh, dann ist mein selbst gemachter Parser bald überflüssig? :cry:
Neiiin, niemals. Mein Parser hat eine Zutat, die der von Borland wohl nicht hat: Liebe :P

delphinia 26. Apr 2011 12:30

AW: Zeichenkette zerlegen...
 
nicht nur das es das dort nicht gibt ich kann keine der 3 JSON Parser nutzen da die alle für Ü D5 gemacht sind!

"superobjectv" habe ich versucht, da fehlen mir Units (msxml zB für das DEMO Projekt) und mein D5 kennt auch nicht:VShortInt und weiter bin ich beim Compelieren nicht gekommen um zu wissen was NOCH fehlt :(


"lkJSON" ist total murks weil kein UTF8String, DupeString, keine Unit StrUtils - und wer weiss was noch fehlt


Tja

himitsu 26. Apr 2011 12:31

AW: Zeichenkette zerlegen...
 
Zitat:

Zitat von Deep-Sea (Beitrag 1096984)
Neiiin, niemals. Mein Parser hat eine Zutat, die der von Borland wohl nicht hat: Liebe :P

Keine Sorge.
Die Speicherverwaltung, die Verwendung und andere Aspekte der Emba-Version sind .... sagen wir mal ... nja, die sind etwas krank gewöhnungsbedürftig.

[add]
msxml sollte vorhanden möglich sein, da dieses nur eine Header-Unit ist und die Funktionalität im Windows steckt.
Das gibt es ferige Units runterzuladen und es gibt Beschreibungen, wir du diese unit selber importierst/erstellst.
(sollte sich alles in Google oder der Forensuche finden lassen)

Und fast Alles, was ANSI kann, das kann man auch für UTF8 misbrauchen.

delphinia 26. Apr 2011 12:36

AW: Zeichenkette zerlegen...
 
Ok msxml ist nun vorhanden! :) danke

Aber das war ja nur das Problem bei der DEMO -- aber der parser selbst lässt sich aufgrund zahlreicher fehlender Dinge nicht compilieren...

DeddyH 26. Apr 2011 12:37

AW: Zeichenkette zerlegen...
 
@delphinia: über Torry habe ich diese Library gefunden. Da steht zwar nicht explizit Delphi 5, sondern Delphi 7, evtl. geht es aber dennoch.

delphinia 26. Apr 2011 12:41

AW: Zeichenkette zerlegen...
 
@DeddyH

Danke aber genau die habe ich hier auch und versuchte sie!



da scheitert mein D5 Std bei dieser geschichte


" result := variants.Null;"
Zitat:

[Fehler] uLkJSON.pas(478): Undefinierter Bezeichner: 'variants'
und ob es dann ALLES ist weiss ich nicht...

Mal abgesehen von all den "{$IF" im Code die ich entfernen muss weil sich der Compiler auch daran sich nicht behaupten kann :(

himitsu 26. Apr 2011 12:43

AW: Zeichenkette zerlegen...
 
Nja, für DupeString gibt es im Forum irgendwo ein paar Ersatzfunktionen und auch sonst kann man Vieles ersetzen/nachbauen.
Im Notfall können wir ja bei einigen Funktionen aushelfen.

DupeString macht ja nun auch nicht grade was sehr Schweres ... ene String-Variable, eine For-Schleife und schon hat man alles zusammen.


Bei soeinem "alten" Delphi wird man leider damit leben ,üssen, daß man an vielen Stellen selber Hand anlegen muß.
PS: eine eMail an germny.info@embarcadero.de und darin ganz lieb nach einer Lizenz für Turbo Delphi fragen

Variants ist eine Unit, welche es doch im D5 schon geben sollte? :gruebel:

DeddyH 26. Apr 2011 12:45

AW: Zeichenkette zerlegen...
 
Und {$IFDEF XXX} sollte IIRC auch Delphi 5 bereits kennen.

himitsu 26. Apr 2011 12:46

AW: Zeichenkette zerlegen...
 
Zitat:

Zitat von DeddyH (Beitrag 1096993)
Und {$IFDEF XXX} sollte IIRC auch Delphi 5 bereits kennen.

Delphi-Quellcode:
{$IFDEF
ja, aber nicht die ConditionalExpressions ala
Delphi-Quellcode:
{$IF
(die gab es, blaub ich, erst seit D6 oder D7)

delphinia 26. Apr 2011 12:49

AW: Zeichenkette zerlegen...
 
Habe Turbo Delphi, Habe die damals alle kostenlosen D Versionen...
Aber ich hänge an D5 da ich dort ALLE komponenten habe die ich so täglich brauche - mal davon ab das bei all den D-Versionen (kostenlosen) ja keine Komponenten eingebunden werden können wenn ich das Recht in Erinnerung habe!
Und der letzte Punkt ist diese neuen Oberflächen alles in einem Fenster -- nicht so schln frei wie in D5...

EGAL

Ich weiss das ich nicht viele Ansprüche stellen kann und vieles selbst machen muss!
Doch wenn man nicht mal weiss welche Funktion sicher hinter DupeString verbirgt wird es schwer... und einfach irgendwo kopieren darf man auch nicht...


Daher versuch ich halt mir das möflichste!

Habe ja auch vieles geschaftt UTF8String habe ich in den JCLs gefunden, MSXML habe ich auf gefunden...

Aber bei sowas wie "result := variants.Null;"
Code:
[Fehler] uLkJSON.pas(478): Undefinierter Bezeichner: 'variants'
Scheitere ich da ich damit nichts anfangen kann da ich nicht mal weiss was "variants" sein soll .... Ich kenne das als Unit bei neueren D-Versionen!

shmia 26. Apr 2011 12:55

AW: Zeichenkette zerlegen...
 
Wenn du in der Projektoptionen in Verzeichnisse/Bedingungen die Unit-Aliase um
Variants=System erweiterst, dann sollte alles sauber durchlaufen. :angel:

himitsu 26. Apr 2011 12:57

AW: Zeichenkette zerlegen...
 
Gut, Anfangs hat mich das alles in einem Fenster auch gestört ... jetzt hab ich mich dran gewöhnt. :angle2:
OK, wenn ich jetzt erwähne, daß man in ganz neuen Delphi-Versionen wieder alles in Einzelfenster zerlegen kann, dann hilft es dir nicht wirklich was. :lol:

OK, also Delphi-Referenz durchsuchenDupeString hängt x mal den angegebenen String aneinander.

Delphi-Quellcode:
DupeString('abc', 5)
liefert also
Delphi-Quellcode:
'abcabcabcabcabc'
zurück.

delphinia 26. Apr 2011 13:01

AW: Zeichenkette zerlegen...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von shmia (Beitrag 1097000)
Wenn du in der Projektoptionen in Verzeichnisse/Bedingungen die Unit-Aliase um
Variants=System erweiterst, dann sollte alles sauber durchlaufen. :angel:

leider nicht - siehe Screen - eingetragen und neu compiliert....

Deep-Sea 26. Apr 2011 13:03

AW: Zeichenkette zerlegen...
 
Mh komisch ... und ich sehne mich nach GIMP 2.8, damit endlich alles in einem Fenster ist. Diese Einzelfenster gehen einem auf die Nerven, besonders wenn sie aus dem Bildschirmbereich ragen :roll:

Ups, Off-Topic. Bin weg ^^

DeddyH 26. Apr 2011 13:06

AW: Zeichenkette zerlegen...
 
In dem Screenshot sehe ich etwas von Klassenmethoden, also dürfte die Delphi 7-Angabe auf Torry wohl auch falsch sein. Zumindest den Variants-Fehler bekäme man wohl weg, wenn man im Code den Unit-Namen austauscht, sofern das mit dem Alias tatsächlich nicht funktioniert.

delphinia 26. Apr 2011 13:17

AW: Zeichenkette zerlegen...
 
habe VARIANTS gegen SYSTEM getauscht - geht (!?)

Aber nun ist wieder etwas was nicht vorhanden "VarToWideStr" das habe ich nicht einmal hier im Forum gefunden!

himitsu 26. Apr 2011 13:26

AW: Zeichenkette zerlegen...
 
Das macht aus einem Variant einen WideString.

Sollte sich durch eine einfache Zuweisung ersetzen lassen.
Delphi-Quellcode:
S := V;
(jenachdem wie der Aufruf genau aussieht, da ich die Codestelle jetzt nicht direkt kenn)

delphinia 26. Apr 2011 13:28

AW: Zeichenkette zerlegen...
 
Delphi-Quellcode:
procedure TlkJSONstring.SetValue(const AValue: Variant);
begin
  FValue := VarToWideStr(AValue);
end;
das der Code

DeddyH 26. Apr 2011 13:30

AW: Zeichenkette zerlegen...
 
Aus der Variants.pas von Delphi 2007 (das Zitat ist hoffentlich erlaubt):
Zitat:

Delphi-Quellcode:
function VarToWideStr(const V: Variant): WideString;
begin
  Result := VarToWideStrDef(V, NullAsStringValue);
end;

function VarToWideStrDef(const V: Variant; const ADefault: WideString): WideString;
begin
  if not VarIsNull(V) then
    Result := V
  else
    Result := ADefault;
end;


himitsu 26. Apr 2011 13:38

AW: Zeichenkette zerlegen...
 
Wenn es VarToWideStr nicht gibt, dann wird vermutlich auch VarToWideStrDef nicht vorhanden sein.

Eventuell liegen die im D5 auch nur woanders.
Delphi-Quellcode:
procedure TlkJSONstring.SetValue(const AValue: Variant);
begin
  FValue := AValue; // Delphi sollte das auch automatisch umwandeln können
end;

delphinia 26. Apr 2011 13:45

AW: Zeichenkette zerlegen...
 
Offtopic: sehe gerade im Memberbereich von "embarcadero.com" das ich sogar 2 Lizenzen für "Turbo Delphi 2006 Explorer Edition" - tzzz *confus*

öhm ja also habe nun auch das von Dir ersetzt...

Delphi-Quellcode:
procedure TlkJSONstring.SetValue(const AValue: Variant);
begin
  FValue := AValue;
end;
aber es wird ein Fass ohne Bode! wir sind gerade bei Zeile 737 von fast 2500 und schon das nächste...

Code:
VarIsNumeric
was mein D5 nicht kennt!

Habe mal nun so durch gescrollt... das wird auch noch weiter so gehen "strSpecialChars" - dann versuch ich mein Glück mal mit anderen Parsern... :(

DANKE EUCH SOWEIT...:thumb:

himitsu 26. Apr 2011 13:53

AW: Zeichenkette zerlegen...
 
VarIsNumeric...

Ja, wie der Name schon sagt ... einfach prüfen, ob im Variant ein nummerischer Wert drin steckt :zwinker:

Delphi-Quellcode:
Result := TryStrToFloat(String(AValue));

// aber TryStrToFloat kennt dein Delphi wohl nicht

var
  E: Integer;
  F: Single;
Val(String(AValue), F, E);
Result := E = 0;
[edit]
halt nee, String() könnte auch noch eine Exception auslösen

Delphi-Quellcode:
try
  StrToFloat(String(AValue));
  Result := True;
except
  Result := False;
end;

delphinia 26. Apr 2011 14:39

AW: Zeichenkette zerlegen...
 
ich habe mit mit dem parser "uJSON" beschäftigt musste zwar auch da eine oder andere.... Aber habe es im Inet gefunden was fehlte bzw verändert und er scheint zu laufen, da ich es nur zum Lesen brauche hoffe och das er mich nicht im Stich lässt!


Noch einmal DANKE an Euch alle die hier echt super geholfen haben!

idefix2 26. Apr 2011 14:44

AW: Zeichenkette zerlegen...
 
Die Frage ist, ob es nicht anders einfacher geht, weil eigentlich brauchst Du doch keinen kompletten Parser.

Wenn Du irgend eine regex Bibliothek findest, die unter Delphi5 läuft, dann sollte es kein grosses Problem sein, dieses eine spezielle Rückgabeformat, das Du hast, mittels regex in ihre Bestandteile zu zerlegen. Ist sicher einfacher, als ein umfangreiches Tool an D5 anzupassen, das zwar viel mehr könnte, aber von dem Du eigentlich nicht viel brauchst.


edit: Der Tipp kam offenbar zu spät - vielleicht umso besser :)

FaTaLGuiLLoTiNe 27. Apr 2011 12:55

AW: Zeichenkette zerlegen...
 
OffTopic:

Zitat:

Zitat von DeddyH (Beitrag 1097005)
In dem Screenshot sehe ich etwas von Klassenmethoden, also dürfte die Delphi 7-Angabe auf Torry wohl auch falsch sein.

Delphi 7 kennt zwar noch keine Klassenvariablen, Klassenmethoden sind aber schon möglich.

DeddyH 27. Apr 2011 13:06

AW: Zeichenkette zerlegen...
 
Tatsächlich? Ich dachte immer, die wären erst mit Delphi 2006 eingeführt worden.

himitsu 27. Apr 2011 13:14

AW: Zeichenkette zerlegen...
 
Klassen-Methoden gab es da schon. (in Delphi 5 oder 6 fehlten die aber noch)

Klassen-Variablen und eingebettete Typen fehlten aber.

Seit 2006 gibt es Record-Methoden.
und wann der
Delphi-Quellcode:
class consstructor
eingeführt wurde, weiß ich jetzt nicht.



Ich sag's ja schon lange ... in die OH gehört mit rein, seit wann es was gibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:40 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