【问题标题】:How to organize this raw string in a TMemo in Delphi?如何在 Delphi 的 TMemo 中组织这个原始字符串?
【发布时间】:2026-02-04 03:55:04
【问题描述】:

我这里有一个非常脏的字符串,我需要一个 Delphi 中的代码来组织它。我的程序总是得到这些脏字符串,看一个。

[{"data":"18/06/2021","dataHora":"18/06/2021 22:08","descricao":"Objeto em trânsito - por favor aguarde","cidade":"SAO JOSE DOS CAMPOS","uf":"SP","destino":{"cidade":"JOSE","uf":"SC"}},{"data":"18/06/2021","dataHora":"18/06/2021 17:52","descricao":"Objeto em trânsito - por favor aguarde","cidade":"SAO JOSE DOS CAMPOS","uf":"SP","destino":{"cidade":"CAMPOS","uf":"SP"}},{"data":"18/06/2021","dataHora":"18/06/2021 16:53","descricao":"Objeto postado","cidade":"SAO JOSE DOS CAMPOS","uf":"SP"}]

我需要一些帮助来整理这些单词,就像:

 data : 18/06/2021  -  dataHora : 18/06/2021 22:08  -  descricao : Objeto em trânsito - por favor aguarde  -  cidade : SAO JOSE DOS CAMPOS  -  uf : SP  -  destino : cidade : CAMPOS , uf : SP 
 data : 18/06/2021  -  dataHora : 18/06/2021 17:52  -  descricao : Objeto em trânsito - por favor aguarde  -  cidade : SAO JOSE DOS CAMPOS  -  uf : SP  -  destino : cidade : CAMPOS  -  uf : SP 
 data : 18/06/2021  -  dataHora : 18/06/2021 16:53  -  descricao : Objeto postado  -  cidade : SAO JOSE DOS CAMPOS  -  uf : SP 

还在继续。最快的制作方法是什么?

【问题讨论】:

  • 这不是一个“脏”字符串。它是JSON。 Delphi 有一个builtin JSON framework,从TJSONObject.ParseJSONValue() 开始,然后从那里开始。但是,为什么要将其放入TMemo?像TListViewTTreeView 这样更结构化的控件可能更有意义。
  • 我想知道你从哪里得到“这个脏字符串”以及为什么源没有立即告诉你它应该是 JSON。你确定你不会错过至少一个重要的事实吗?根据您和this guy 一起工作的数据。

标签: delphi


【解决方案1】:

您拥有的字符串是一个格式完美的 JSON 数组。写成源代码,可读性更好(JSON不在双引号字符串内时不关心空格):

JSONText : String =
        '[' +
        '    {' +
        '       "data":      "18/06/2021",' +
        '       "dataHora":  "18/06/2021 22:08",' +
        '       "descricao": "Objeto em trânsito - por favor aguarde",' +
        '       "cidade":    "SAO JOSE DOS CAMPOS",' +
        '       "uf":        "SP",' +
        '       "destino":   {' +
        '                       "cidade": "JOSE",' +
        '                       "uf":     "SC"' +
        '                    }' +
        '    },' +
        '    {' +
        '       "data":      "18/06/2021",' +
        '       "dataHora":  "18/06/2021 17:52",' +
        '       "descricao": "Objeto em trânsito - por favor aguarde",' +
        '       "cidade":    "SAO JOSE DOS CAMPOS",' +
        '       "uf":        "SP",' +
        '       "destino":   {' +
        '                       "cidade": "CAMPOS",' +
        '                       "uf":     "SP"}},' +
        '    {' +
        '       "data":      "18/06/2021",' +
        '       "dataHora":  "18/06/2021 16:53",' +
        '       "descricao": "Objeto postado",' +
        '       "cidade":    "SAO JOSE DOS CAMPOS",' +
        '       "uf":        "SP"' +
        '    }' +
        ']';

以下是解码它并将其写入 TMemo 的可能解决方案:

procedure TForm1.Button2Click(Sender: TObject);
var
    JSONArray         : TJSONArray;
    ArrayElement      : TJSONValue;
    ItemData          : String;
    ItemDataHora      : String;
    ItemDescricao     : String;
    ItemCidade        : String;
    ItemUf            : String;
    ItemDestino       : TJSONValue;
    ItemDestinoCidade : String;
    ItemDestinoUf     : String;
begin
    Memo1.Clear;
    JSONArray := TJSONObject.ParseJSONValue(JSONText) as TJSONArray;
    try
        for ArrayElement in JsonArray do begin
            ItemData      := ArrayElement.GetValue<String>('data');
            ItemDataHora  := ArrayElement.GetValue<String>('dataHora');
            ItemDescricao := ArrayElement.GetValue<String>('descricao');
            ItemCidade    := ArrayElement.GetValue<String>('cidade');
            ItemUf        := ArrayElement.GetValue<String>('uf');
            ItemDestino   := ArrayElement.FindValue('destino');
            if Assigned(ItemDestino) then begin
                ItemDestinoCidade := ItemDestino.GetValue<String>('cidade');
                ItemDestinoUf     := ItemDestino.GetValue<String>('uf');
            end
            else begin
                ItemDestinoCidade := '';
                ItemDestinoUf     := '';
            end;
            Memo1.Lines.Add(Format('data : %s  -  dataHora : %s  -  descricao : %s  -  cidade : %s  -  uf : %s  -  destino : cidade : %s , uf : %s',
                                   [ItemData,
                                    ItemDataHora,
                                    ItemDescricao,
                                    ItemCidade,
                                    ItemUf,
                                    ItemDestinoCidade,
                                    ItemDestinoUf]));
        end;
    finally
        JSONArray.Free;
    end;
end;

您要求将其写入 TMemo,但使用 TStringGrid 或 TTreeView 可能会更好。

【讨论】:

  • 老兄,你拯救了我的一天!谢谢,请选择绿色勾号!你是个巫师!