jSon_encode-ähnliche Funktion für Delphi, die TDataSet akzeptiert

Ich wurde mit der Erstellung eines Indy-Servers in Delphi 2007 beauftragt, der mit Clients kommuniziert und json-formatierte Daten aus SQL-basierten Datenbanken zurückgibt. Jemand aus unserem Büro hat mit PHP einen Prototyp erstellt. Und im Prototyp verwenden sie diejSon_encode Funktion ausgiebig, um die Daten aus Tabellen zurückzugeben. Ich habe mich gefragt, ob es eine ähnliche Delphi-Funktion gibt, die a akzeptieren kannTDataSet Parameter und Rückgabe korrekt formatierter JSON-Daten.

Kennt jemand eine solche Funktion?

Update 12.10.2013 - meine Änderung an @ user2748835 Antwort:

function jsonencode(mString: String): String;
begin
  result := StringReplace(mString,'''','\''',[rfReplaceAll,rfIgnoreCase]);
  result := StringReplace(mString,'\','\\',[rfReplaceAll,rfIgnoreCase]);
  result := StringReplace(result,crlf,'\n',[rfReplaceAll,rfIgnoreCase]);
  result := StringReplace(result,'"','\"',[rfReplaceAll,rfIgnoreCase]);
  result := StringReplace(result,'/','\/',[rfReplaceAll,rfIgnoreCase]);
  result := StringReplace(result,'#9','\t',[rfReplaceAll,rfIgnoreCase]);
end;

function jSon_encode(aDataset:TDataset):string;
  function fieldToJSON(thisField:TField):string;
  begin
    try
      result := '"'+thisField.fieldName+'":';
      case thisField.DataType of
        ftInteger,ftSmallint,ftLargeint:
          result := result+inttostr(thisField.AsInteger);
        ftDateTime:
          result := result+'"'+formatdatetime('YYYY-MM-DD HH:NN:SS',thisField.AsDateTime)+'"';
        ftCurrency,
        ftFloat:
          result := result + floattostr(thisField.AsFloat);
        ftString :
          result := result + '"'+jsonencode(thisField.AsString)+'"';
        else
      end; // case
      result := result + ','; 
    except
      on e: Exception do begin
        appendtolog('problem escaping field '+thisfield.fieldname);
      end;
    end;

  end; // of fieldToJSON

  function rowToJSON(ds:TDataset):string;
  var
    fieldIx : integer;
  begin
    result := '';
    for fieldIx := 0 to ds.fieldcount-1 do
      result := result + fieldToJSON(ds.Fields[fieldIx]);
    // trim comma after last col
    result := '{'+copy(result,1,length(result)-1)+'},';
  end; // of rowToJSON
begin
  result := '';
  with aDataset do
  begin
    if not bof then first;
    while not eof do
    begin
      result := result + rowToJSON(aDataset);
      next;
    end;
  end;
  //strip last comma and add
  if length(result)>0 then
    result := copy(result,1,length(result)-1);
  result := '['+result+']';
end; // of DSToJSON

Antworten auf die Frage(3)

Ihre Antwort auf die Frage