![]() |
Datenbank: dbExpress • Version: ? • Zugriff über: sqlite
DB Abfrage als JSON ausgeben
Hallo zusammen,
ich habe aktuell eine sqlite-DB mit der ich über dbExpress zugreife die DB enthält unter anderem zwei TEXT Felder im Format '[1,2,3,4,5...300]' mit 80 bis 2000 Werten. Diese Felder (und andere) hole ich mir über eine entsprechende TSQLQuery und wandle das ganze nach JSON (vereinfacht):
Delphi-Quellcode:
LQueryObject := TJSONObject.Create;
LQArray := TJSONArray.Create; LQueryObject.AddPair('data', LQArray); fQuery.CommandText := '.....'; fQuery.Open; fQuery.First; while Not fQuery.Eof do begin LItem := TJSONObject.Create; for i := 0 to fLongVSQuery.Fields.Count-1 do begin if Not fQuery.Fields[i].IsNull then begin LItem.AddPair( fQuery.FieldDefs[i].Name, fQuery.Fields[i].AsString ) end; end; LQArray.AddElement(LItem); fQuery.Next; end; fQuery.Close; Result := LQueryObject.ToString; ... Alle "anderen" Felder meiner Abfrage sind Strings und können wie oben übernommen werden. Für die TEXT Felder funktioniert das nicht, denn ich bekomme (natürlich) als Ergebnis:
Code:
Daher habe ich für diese Felder eine "Sonderbehandlung" implementiert:
{
"data": [ { "...": "...." "myarray": "[1,2,3,4,5..,300]" statt: "myarray": [1,2,3,4,5,..,300] { ... } ] }
Delphi-Quellcode:
LItem.AddPair(
fQuery.fFieldDefs[i].Name, TJSONObject.ParseJSONValue(fQuery.Fields[i].AsString) As TJSONArray; ) Das ergibt zwar sauberen JSON-Output, ist aber leider extrem spürbar bei der Abfragedauer (bei ~ 1000 zurückgegebenen Objekten). Daher die alles entscheidende Frage: Ist es irgendwie möglich, den schon vorhandenen String zu verwenden ohne ihn zuerst zurück in ein TJSON-Integer-Array und dann wieder in einen String zu wandeln? Ich habe das ganz auch mit einer TStringList umgesetzt (also JSON selber erzeugen), dass ist viel schneller aber auch deutlich weniger schön/flexibel, ist das eine vernünftige Lösung? |
AW: DB Abfrage als JSON ausgeben
Was ist wenn man die strings einfach quoted "1,2,..300"
|
AW: DB Abfrage als JSON ausgeben
Zitat:
Ein Ausweg wäre ein manuelles Schreiben des JSON-Strings. |
AW: DB Abfrage als JSON ausgeben
Jupp, AsString ist nunmal ein String, also wird es als String gespeichert.
Du mußt das also zerlegen und dann daraus ein JSON-Array machen. Du kannst manuell diese Integer-Liste zerlegen und ein JsonArray bauen, oder (mit den [ ] drumrum) es vom JsonParser in ein Array konvertieren lassen und das Array dann einfügen. Wenn/da die JSON-Implementation vom Delphi jetzt nicht sooo flott ist, bleibt nur der Ausweg unschön den JSON-Text selbst zusammenzubauen oder eine andere JSON-Lib zu suchen. |
AW: DB Abfrage als JSON ausgeben
Danke für die Hinweise! Beim Überlegen bin ich dann auf folgende Möglichkeit gekommen:
Delphi-Quellcode:
Hinzufügen, kann ich mein Array dann wie folgt:
type
TJSONStringedArray = class(TJSONString) public procedure ToChars(Builder: TStringBuilder); override; end; implementation { TJSONStringArray } procedure TJSONStringedArray.ToChars(Builder: TStringBuilder); begin // inherited; if Not IsNULL then begin Builder.Append(Value); end; end;
Delphi-Quellcode:
Damit stimmt dann auch die Ausgabe im JSON.
...
LItem.AddPair( AQuery.fJSONDefs[i].Name, TJSONStringedArray.Create(fQuery.Fields[i].AsString) ) Anm.: Man könnte noch ToBytes() überschreiben um die Ausgabe in einen Stream zu ermöglichen (verwende ich aber nicht). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:39 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