我正在开发一个小项目,需要我解析一个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文件更复杂,这可能会导致不可预见的问题。任何想法?
答案 0 :(得分:3)
由于您知道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;