【问题标题】:Alternative to using StringReplace to remove unwanted characters from a JSON response替代使用 StringReplace 从 JSON 响应中删除不需要的字符
【发布时间】:2014-09-05 03:04:31
【问题描述】:

我正在处理一个需要解析 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 函数删除所有[]"characters,所以我留下了一个现在看起来像这样red, green, blue 的字符串,这工作正常,但我正在寻找这种方法的替代方法,这种方法更适合这类事情,而不是依赖 StringReplace 函数,如果我需要解析的 JSON 文件更复杂,这可能会导致无法预料的问题。有什么想法吗?

【问题讨论】:

  • +1 用于认识到基于临时字符串的解析是错误的解决方案并希望以正确的方式进行

标签: json delphi superobject


【解决方案1】:

既然您知道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;

【讨论】:

  • 感谢您提供冗长的示例。非 stigify 方法是我试图想到的方法。我知道 SuperObject 也有一个 Format 函数,我能够让它适用于简单的事情,但不能让它适用于数组项。我认为你的方法很适合我的需要,再次感谢你花时间把这些都写出来。
  • @Remy 为什么你会考虑解析器以外的任何东西?选项 1 和 2 应附有大量健康警告。
猜你喜欢
  • 2013-04-17
  • 2015-11-05
  • 1970-01-01
  • 2021-06-27
  • 2022-01-12
  • 2017-06-04
  • 2021-11-16
  • 2011-12-24
相关资源
最近更新 更多