替代使用StringReplace从JSON响应中删除不需要的字符

时间:2014-07-15 03:28:11

标签: json delphi superobject

我正在开发一个小项目,需要我解析一个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函数删除所有[]"字符,所以我留下了一个现在看起来像这样的字符串{{1这工作正常,但我正在寻找这种方法的替代方法,这种方法更适合这种事情,而不是依赖于StringReplace函数,如果我需要解析的JSON文件更复杂,这可能会导致不可预见的问题。任何想法?

1 个答案:

答案 0 :(得分: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;
    
  3. 或者,根本不要对整个数组进行字符串化。迭代数组,提取您需要的各个值:

    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;