Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DBXJSON in XE4 (https://www.delphipraxis.net/184697-dbxjson-xe4.html)

Captnemo 15. Apr 2015 11:16

DBXJSON in XE4
 
Hi,

gibt's irgendwo eine durchgängige, verständliche Dokumentation, aus der ich lernen kann, wie ich damit einen JSON-String einlesen, dass Array auslösen und die Elemente auslesen kann?
Mit der Delphi-Hilfe probier ich schon Stundenlang rum, komme aber nicht wirklich dahinter, wie ich das jetzt machen soll. Und bei Google finde ich auch nicht wirklich was, was mir den Zusammenhang so erklärt, dass ich das raffe.

Im Grund habe ich einen solchen String:
{"Uptime":"0T 0H 0M 25S","Wiegungen":"0","Letzte Meldung":"30.12.1899 00:00:00","Waage":"Verbunden"}

den ich zerlegen will.

Union 15. Apr 2015 11:27

AW: DBXJSON in XE4
 
Schau mal in die Dokumentation

Der schöne Günther 15. Apr 2015 11:29

AW: DBXJSON in XE4
 
Was ist dein Plan mit "zerlegen"? Die einzelnen Paare da heraus extrahieren?
Ansonsten hier das Beispiel zur grade verlinkten Doku:

Delphi-Quellcode:
program Project25;

{$APPTYPE CONSOLE}

{$R *.res}

uses
   System.SysUtils, Data.DBXJson, Data.DBXJSONReflect, System.JSON;

const
   meinString = '{"Uptime":"0T 0H 0M 25S","Wiegungen":"0","Letzte Meldung":"30.12.1899 00:00:00","Waage":"Verbunden"}';

procedure justJsonThings();
var
   jsonObj:   TJsonObject;
   pairIndex:   Integer;
   pair:      TJSONPair;
begin
   jsonObj := TJsonObject.ParseJSONValue(meinString) as TJSONObject;
   try
      for pairIndex := 0 to Pred(jsonObj.Count) do begin
         pair := jsonObj.Pairs[pairIndex];
         WriteLn(pair.ToJSON());
      end;
   finally
      jsonObj.Destroy();
   end;
end;


begin
  try
   justJsonThings();
  except
   on E: Exception do
     Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.
Delphi-Quellcode:
System.Json
gab es in XE4 noch nicht, die Typen wie TJsonObject steckten da, glaube ich, noch in
Delphi-Quellcode:
Data.DBXJSONReflect
.

Oder willst du (das glaube ich eher) zwischen deinem TWiegeStatus und JSON umwandeln?

Captnemo 15. Apr 2015 12:40

AW: DBXJSON in XE4
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1297811)
Was ist dein Plan mit "zerlegen"? Die einzelnen Paare da heraus extrahieren?

So isses.

Zitat:

Zitat von Der schöne Günther (Beitrag 1297811)
gab es in XE4 noch nicht, die Typen wie TJsonObject steckten da, glaube ich, noch in
Delphi-Quellcode:
Data.DBXJSONReflect
.

Also bei mir ist es in der Unit Data.DBXJSON drin. Allerdings gibt es dort beim TJSONObject weder die Eigenschaft Count noch Pairs. Sonst ist das Beispiel ja logisch nachvollziehbar, und so würde ich es auch gerne machen.

Zitat:

Zitat von Der schöne Günther (Beitrag 1297811)
Oder willst du (das glaube ich eher) zwischen deinem TWiegeStatus und JSON umwandeln?

Es geht darum, bestimmte Statusinformationen (die sich noch ändern) von einem anderen Programm per Webservice abzurufen.

Der schöne Günther 15. Apr 2015 12:56

AW: DBXJSON in XE4
 
Schau doch in der XE4-Doku:

http://docwiki.embarcadero.com/Libra...Object_Methods

Statt Count hieß es wohl Size und die Pairs bekommt man über Get()

Union 15. Apr 2015 13:17

AW: DBXJSON in XE4
 
z.B. So:
Delphi-Quellcode:
program DPJSon;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Data.DBXJSON;

procedure DumpJSON;
var
  LJSONObject : TJSONObject;
  LJSONPair : TJSONPair;
begin
  LJSONObject := TJSONObject.ParseJSONValue(
    TEncoding.ASCII.GetBytes('{"Uptime":"0T 0H 0M 25S","Wiegungen":"0","Letzte Meldung":"30.12.1899 00:00:00","Waage":"Verbunden"}'), 0) as TJSONObject;

  // Alle auflisten
  for LJSONPair in LJSONObject do
  begin
    Write(LJSONPair.JsonString.Value + '=');
    Writeln(LJSONPair.JsonValue.Value);
  end;

  // Einen bestimmten auflisten
  write('Wert von "Letzte Meldung" ');
  Writeln(LJSONObject.Get('Letzte Meldung').JsonValue.Value);
  Readln;
end;

begin
  DumpJSON;
end.

Captnemo 15. Apr 2015 13:34

AW: DBXJSON in XE4
 
Ah, jetzt hab ich's kapiert (denke ich mal ;)

Meine Funktion sieht jetzt so aus:

Delphi-Quellcode:
  function GetJsonValue (json: string; Identifier: string) : string;
    function ExtractQuoteStr(QoutedStr: string): string;
    begin
      Result:=QoutedStr;
      if Result[1]='"' then
        Result:=Copy(Result, 2, length(Result));
      if Result[Length(Result)]='"' then
        Result:=Copy(Result, 1, length(Result)-1);
    end;
  var
    jsonObj:  TJsonObject;
    pair:     TJSONPair;
  begin
    Result:='';
    jsonObj:=TJSONObject.ParseJSONValue(json) as TJSONObject;
    try
      for pair in jsonObj do
      begin
        if ExtractQuoteStr(pair.JsonString.ToString)=Identifier then
          Result:=ExtractQuoteStr(pair.JsonValue.ToString);
      end;
    finally
      jsonObj.Destroy();
    end;
  end;
So kann ich mir einfach über den Identifier die dazu gehörige Value aus dem JSON-String holen.

Danke an alle.

Sir Rufo 15. Apr 2015 13:52

AW: DBXJSON in XE4
 
Wegen dem
Delphi-Quellcode:
ExtractQuoteStr
... Hast du dir mal angesehen, was du da zurück bekommst bevor du da noch daran herumwurschtelst?

Die Quotes gehören zur JSON-Struktur und dürften im Wert nicht mehr vorkommen, und wenn, dann gehören die zum Wert.

Union 15. Apr 2015 14:07

AW: DBXJSON in XE4
 
Ja, warum verwendest Du nicht die Get() Methode? Und wenn Du die schon nachprogrammierst, dann solltest Du den richtigen Vergleich verwenden.
Delphi-Quellcode:
if pair.JsonString.Value = Identifier

Captnemo 16. Apr 2015 07:13

AW: DBXJSON in XE4
 
Ich hab's halt so gemacht, wie ich es verstehe bzw. verstanden habe.

Wenn ich es besser machen kann, dann nehme ich das gerne an, nur weiß ich leider nicht, was ihr meint.

Das JSON Quotes verwendet ist ja schön und gut, aber
Delphi-Quellcode:
pair.JsonValue.ToString
liefert mir nun mal die Quotes mit zurück, und die gehören definitiv nicht zum String, sondern die hat mir er mich mit dieser Procedure

Delphi-Quellcode:
  json:=TJSONObject.Create;
  for I := 0 to FWaagen.Count-1 do
  begin
    if not FWaagen[i].Pfoertner then
    begin
      jso:=TJSONObject.Create;
      jso.AddPair(TJSONPair.Create('Uptime', FWaagen[i].Uptime));
      jso.AddPair(TJSONPair.Create('Wiegungen', FWaagen[i].Wiegungen));
      jso.AddPair(TJSONPair.Create('Letzte Wiegung', FWaagen[i].LetzteWiegung));
      jso.AddPair(TJSONPair.Create('ComStatus', FWaagen[i].ComStatus));
      json.AddPair(FWaagen[i].guid, jso.ToString);
    end;
  end;
da auch selber reingesetzt. Und weil er sie nunmal nicht selber wieder rausnimmt, hab ich's halt selbst gemacht.

Die GetJsonValue-Function habe ich ja schon gepostet.

Zitat:

Zitat von Union (Beitrag 1297861)
Ja, warum verwendest Du nicht die Get() Methode? Und wenn Du die schon nachprogrammierst, dann solltest Du den richtigen Vergleich verwenden.
Delphi-Quellcode:
if pair.JsonString.Value = Identifier

Was meinst du mit Get() Methode?

Ich vermute jetzt mal, wenn ich es richtig machen, dann würde er mir die Quotes wohl auch selber rausnehmen (genauso wie das '\"', was ebenfalls gerade zu einem Problem wurde).

Mir ist klar, dass ich das noch nicht korrekt gemacht habe, aber ich gebe mir mühe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:55 Uhr.
Seite 1 von 2  1 2      

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