4

JSONファイルを解析して結果をデータベースに配置する必要がある小さなプロジェクトに取り組んでいます。私は SuperOjbect を使用してファイルを解析し、結果を生成していますが、ちょっとした障害にぶつかったので、助けが必要です。

解析する必要がある JSON ファイルの例を次に示します。実際には、これらのファイルにはこれよりも多くの情報が含まれていますが、これは、私が作業しているデータの種類の例を示すためのものです。

{
    "id" : 1,
    "object" : "value",
    "colors" : ["red", "green", "blue"],
}

ファイルの一部 (この場合は配列) を解析するために使用しているコードの例を次に示します。

var
  jo : ISuperObject;
begin
  jo := TSuperObject.ParseFile('response.txt', TRUE);
  ShowMessage(jo['colors'].AsString);
end;

これにより、次のような文字列が得られます。["red", "blue", "green"]次に、StringReplace 関数を使用してすべての[]"文字を削除するため、このような文字列が残り、これは正常に機能しますred, green, blueが、この方法に代わる方法を探しています。解析する必要がある JSON ファイルがより複雑な場合に予期しない問題を引き起こす可能性がある StringReplace 関数に依存するのではなく、この種のことのために設計されています。何か案は ?

4

1 に答える 1

3

colorsは配列であり、配列は常に角かっこで文字列化されているため、 を使用しCopy()て角かっこを削除してください。文字の削除について"。いくつかのオプションがあります。

  1. StringReplace()あなたがすでに知っているように、を使用してください:

    var
      jo : ISuperObject;
      s: string;
    begin
      jo := TSuperObject.ParseFile('response.txt', TRUE);
      s := jo['colors'].AsString;
      s := Copy(s, 2, Length(s)-2);
      s := StringReplace(s, '"', '', [rfReplaceAll]);
      ShowMessage(s);
    end;
    
  2. を使用しTStringListます。デフォルトQuoteCharはであるため、そのプロパティ"を使用して引用符で囲まれた値を解析できます。CommaText

    var
      jo : ISuperObject;
      sl: TStringList;
      s: string;
    begin
      jo := TSuperObject.ParseFile('response.txt', TRUE);
      s := jo['colors'].AsString;
      sl := TStringList.Create;
      try
        sl.CommaText := Copy(s, 2, Length(s)-2);
        s := sl.CommaText;
      finally
        sl.Free;
      end;
      ShowMessage(s);
    end;
    

または、配列全体を文字列化しないでください。配列を反復処理して、必要な個々の値を抽出します。

var
  jo : ISuperObject;
  arr: ISuperObject;
  sl: TStringList;
  i: Integer;
  s: string;
begin
  jo := TSuperObject.ParseFile('response.txt', TRUE);
  arr := jo['colors'].AsArray;
  sl := TStringList.Create;
  try
    for i := 0 to arr.Length-1 do
      sl.Add(arr.S[i]);
    s := sl.CommaText;
  finally
    sl.Free;
  end;
  ShowMessage(s);
end;
于 2014-07-15T03:43:50.450 に答える