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?