Einzelnen Beitrag anzeigen

Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
441 Beiträge
 
Delphi 10.3 Rio
 
#1

DB Abfrage als JSON ausgeben

  Alt 29. Feb 2024, 16:26
Datenbank: dbExpress • Version: ? • Zugriff über: sqlite
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:
{
  "data": [
    {
      "...": "...."
      "myarray": "[1,2,3,4,5..,300]"      statt: "myarray": [1,2,3,4,5,..,300]
    {
      ...
    }
  ]
}
Daher habe ich für diese Felder eine "Sonderbehandlung" implementiert:

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?
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat