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这工作正常,但我正在寻找这种方法的替代方法更多的是为这类事情设计的,而不是依赖于 StringReplace 函数,如果我需要解析的 JSON 文件更复杂,这可能会导致无法预料的问题。有任何想法吗 ?

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 回答