AGB  ·  Datenschutz  ·  Impressum  







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

DBXJSON in XE4

Ein Thema von Captnemo · begonnen am 15. Apr 2015 · letzter Beitrag vom 16. Apr 2015
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

DBXJSON in XE4

  Alt 15. Apr 2015, 11:16
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: DBXJSON in XE4

  Alt 15. Apr 2015, 11:27
Schau mal in die Dokumentation
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: DBXJSON in XE4

  Alt 15. Apr 2015, 11:29
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.
System.Json gab es in XE4 noch nicht, die Typen wie TJsonObject steckten da, glaube ich, noch in Data.DBXJSONReflect .

Oder willst du (das glaube ich eher) zwischen deinem TWiegeStatus und JSON umwandeln?
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#4

AW: DBXJSON in XE4

  Alt 15. Apr 2015, 12:40
Was ist dein Plan mit "zerlegen"? Die einzelnen Paare da heraus extrahieren?
So isses.

gab es in XE4 noch nicht, die Typen wie TJsonObject steckten da, glaube ich, noch in 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.

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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Der schöne Günther

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

AW: DBXJSON in XE4

  Alt 15. Apr 2015, 12:56
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()
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: DBXJSON in XE4

  Alt 15. Apr 2015, 13:17
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#7

AW: DBXJSON in XE4

  Alt 15. Apr 2015, 13:34
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

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

AW: DBXJSON in XE4

  Alt 15. Apr 2015, 13:52
Wegen dem 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.
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)
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#9

AW: DBXJSON in XE4

  Alt 15. Apr 2015, 14:07
Ja, warum verwendest Du nicht die Get() Methode? Und wenn Du die schon nachprogrammierst, dann solltest Du den richtigen Vergleich verwenden.
if pair.JsonString.Value = Identifier
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#10

AW: DBXJSON in XE4

  Alt 16. Apr 2015, 07:13
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 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.

Ja, warum verwendest Du nicht die Get() Methode? Und wenn Du die schon nachprogrammierst, dann solltest Du den richtigen Vergleich verwenden.
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  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 05:49 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