我正在开发一个小项目,该项目需要我解析 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 函数删除所有 []"
字符,所以我留下了一个现在看起来像这样的红色、绿色、蓝色
的字符串,这工作正常,但我正在寻找一种更适合此方法的替代方法类似的事情,而不是依赖 StringReplace 函数,如果我需要解析的 JSON 文件更复杂,这可能会导致不可预见的问题。有什么想法吗?
最佳答案
由于您知道 colors
是一个数组,并且数组总是用括号进行字符串化,因此只需使用 Copy()
删除括号即可。至于删除 "
字符。您有几个选择:
使用
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;
使用
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;
关于json - 使用 StringReplace 从 JSON 响应中删除不需要的字符的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24749385/