Skip to content

Datenverarbeitung (JSON und CSV)

NeoObjectPascal bietet native Unterstützung für zwei der gängigsten Datenformate: JSON und CSV. Beide verwenden dieselbe deklarative Syntax parse(...) into variavel;, die eine Zeichenkette analysiert und das Ergebnis in einer Variablen vom Typ Object ablegt.

JSON analysieren

Verwenden Sie JSON.parse(textoJson) into variavel;, um eine JSON-Zeichenkette in ein Objekt umzuwandeln. Anschließend greifen Sie über die Punktnotation auf die Felder zu:

npas
var dados: Object;
var jsonString: String;

begin
    jsonString := '{"nome": "Carmen", "idade": 30}';
    JSON.parse(jsonString) into dados;

    WriteLn("Nome: ", dados.nome);
    WriteLn("Idade: ", dados.idade);
end.
Saída
 Nome: Carmen Idade: 30 

Einfache Anführungszeichen helfen

Da JSON intern doppelte Anführungszeichen verwendet, vermeidet das Schreiben der Zeichenkette mit einfachen Anführungszeichen ('...') Konflikte. Beide Arten von Anführungszeichen sind für String-Literale in NeoObjectPascal gleichwertig.

Verschachtelte Objekte

Der Zugriff über den Punkt funktioniert in beliebiger Tiefe der Struktur:

npas
var config: Object;

begin
    config := '{"servidor": {"host": "localhost", "porta": 8080}}';
    JSON.parse(config) into config;

    WriteLn("Host: ", config.servidor.host);
    WriteLn("Porta: ", config.servidor.porta);
end.
Saída
 Host: localhost Porta: 8080 

CSV analysieren

Verwenden Sie CSV.parse(textoCsv) into variavel;, um eine CSV-Zeichenkette in eine Liste von Zeilen umzuwandeln, wobei jede Zeile eine Liste von Spalten ist. Das Ergebnis ist ein Object, das Sie durchlaufen können:

npas
var dados: Object;
var csvString: String;

begin
    csvString := "nome,idade
Carina,30
Bruno,25";
    CSV.parse(csvString) into dados;

    // dados[0] é a primeira linha; dados[0][0] é a primeira coluna
    WriteLn("Primeira pessoa: ", dados[0][0]);
    WriteLn("Idade dela: ", dados[0][1]);
end.
Saída
 Primeira pessoa: Carina Idade dela: 30 

Die Zeilen durchlaufen

Da das Ergebnis von CSV.parse iterierbar ist, können Sie for..in verwenden, um jede Zeile zu verarbeiten:

npas
var linhas: Object;
var linha: Object;

begin
    linhas := "produto,preco
Cafe,12
Cha,8";
    CSV.parse(linhas) into linhas;

    for linha in linhas do
        WriteLn(linha[0], " custa ", linha[1]);
end.
Saída
 produto custa preco Cafe custa 12 Cha custa 8 

Auch die Kopfzeile ist eine Zeile

CSV.parse unterscheidet nicht zwischen der Kopfzeile und den Datenzeilen: Die erste Zeile (produto,preco) wird wie jede andere zurückgegeben. Wenn Ihre CSV-Datei eine Kopfzeile hat, überspringen Sie beim Verarbeiten der Daten den Index 0.

Kombination mit Pipe und Java

Die analysierten Daten sind gewöhnliche Werte und können eine funktionale Pipeline oder einen Java-Block speisen. Zum Beispiel, um ein Feld direkt nach dem Parsen umzuwandeln:

npas
function emMaiusculas(texto: String): String
begin
    return java:(texto) {
        return ((String)param0).toUpperCase();
    };
end;

var pedido: Object;

begin
    pedido := '{"cliente": "ana silva"}';
    JSON.parse(pedido) into pedido;

    WriteLn(pedido.cliente |> emMaiusculas);
end.
Saída
 ANA SILVA 

Bewährte Praktiken

  • Prüfen Sie die Herkunft der Daten: Zeichenketten aus Dateien oder aus dem Netzwerk können fehlerhaft sein. Umschließen Sie das Parsen mit try/catch, wenn die Eingabe nicht vertrauenswürdig ist — siehe Fehlerbehandlung.
  • Deklarieren Sie die Zielvariable als Object, da JSON und CSV dynamische Strukturen erzeugen.
  • Behandeln Sie bei CSV-Dateien mit Kopfzeile die Zeile 0 getrennt von den übrigen.

Als Nächstes erfahren Sie, wie Sie mit der Konsole interagieren, unter Ein- und Ausgabe.