解析 JSON 中的字符串数组
Parse an array of strings in JSON
在 Delphi 10 Seattle 中,我正在尝试解析 JSON,其中包含 属性.
中的字符串数组
举个例子,考虑这个:
{
"name":"Joe",
"age":45,
"languages":["c++", "java", "cobol"]
}
如何解析 languages
以获得字符串数组?
function TForm1.GetLangArray(const AJSONStr: String): TArray<String>;
var
AJSONVal, AJSONElem: TJSONValue;
AJSONArray: TJSONArray;
i: Integer;
begin
AJSONVal := TJSONObject.ParseJSONValue(AJSONStr);
AJSONVal := AJSONVal.P['languages'];
if (AJSONVal is TJSONArray) then
AJSONArray := AJSONVal as TJSONArray
else
Exit;
with AJSONArray do
begin
SetLength(Result, Count);
i := 0;
for AJSONElem in AJSONArray do
begin
Result[i] := AJSONelem.Value;
Inc(i);
end;
end;
end;
更新
感谢@RemyLebeau 的评论。我修复了之前代码的内存泄漏:
function TForm1.GetLangArray(const AJSONStr: String): TArray<String>;
var
AJSONVal, AJSONElem: TJSONValue;
AJSONArray: TJSONArray;
i: Integer;
begin
AJSONVal := TJSONObject.ParseJSONValue(AJSONStr);
try
AJSONArray := AJSONVal.P['languages'] as TJSONArray;
with AJSONArray do
begin
SetLength(Result, Count);
i := 0;
for AJSONElem in AJSONArray do
begin
Result[i] := AJSONElem.Value;
Inc(i);
end;
end;
finally
AJSONVal.Free;
end;
end;
尝试这样的事情:
function GetLanguagesArray(const AJSON: String): TArray<String>;
var
LValue: TJSONValue;
LArray: TJSONArray;
i: Integer;
begin
Result := nil;
LValue := TJSONObject.ParseJSONValue(AJSON);
if LValue <> nil then
try
LArray := (LValue as TJSONObject).GetValue('languages') as TJSONArray;
SetLength(Result, LArray.Count);
for i := 0 to Pred(LArray.Count) do
begin
Result[i] := LArray[i].Value;
end;
finally
LValue.Free;
end;
end;
使用 REST.JSON 非常简单,使用帮助程序解析和读取数组项
type
TDeveloper = class
private
FAge : Integer;
FName : string;
FLanguages: TArray<string>;
public
property Age : Integer read FAge write FAge;
property Name : string read FName write FName;
property Languages: TArray<string> read FLanguages write FLanguages;
end;
// Sample
var
FDeveloper: TDeveloper;
FLanguage : string;
begin
try
FDeveloper := TJson.JsonToObject<TDeveloper>(Memo1.Text);
Memo2.Clear;
Memo2.Lines.Add('------------------------------ ');
Memo2.Lines.Add('Name: ' + FDeveloper.Name);
Memo2.Lines.Add('Age : ' + FDeveloper.Age.ToString);
for FLanguage in FDeveloper.Languages do
begin
Memo2.Lines.Add('------------------------------ ');
Memo2.Lines.Add(FLanguage);
end;
finally
FreeAndNil(FDeveloper);
end;
见图:
[1]: https://i.stack.imgur.com/69Zao.png
在 Delphi 10 Seattle 中,我正在尝试解析 JSON,其中包含 属性.
中的字符串数组举个例子,考虑这个:
{
"name":"Joe",
"age":45,
"languages":["c++", "java", "cobol"]
}
如何解析 languages
以获得字符串数组?
function TForm1.GetLangArray(const AJSONStr: String): TArray<String>;
var
AJSONVal, AJSONElem: TJSONValue;
AJSONArray: TJSONArray;
i: Integer;
begin
AJSONVal := TJSONObject.ParseJSONValue(AJSONStr);
AJSONVal := AJSONVal.P['languages'];
if (AJSONVal is TJSONArray) then
AJSONArray := AJSONVal as TJSONArray
else
Exit;
with AJSONArray do
begin
SetLength(Result, Count);
i := 0;
for AJSONElem in AJSONArray do
begin
Result[i] := AJSONelem.Value;
Inc(i);
end;
end;
end;
更新
感谢@RemyLebeau 的评论。我修复了之前代码的内存泄漏:
function TForm1.GetLangArray(const AJSONStr: String): TArray<String>;
var
AJSONVal, AJSONElem: TJSONValue;
AJSONArray: TJSONArray;
i: Integer;
begin
AJSONVal := TJSONObject.ParseJSONValue(AJSONStr);
try
AJSONArray := AJSONVal.P['languages'] as TJSONArray;
with AJSONArray do
begin
SetLength(Result, Count);
i := 0;
for AJSONElem in AJSONArray do
begin
Result[i] := AJSONElem.Value;
Inc(i);
end;
end;
finally
AJSONVal.Free;
end;
end;
尝试这样的事情:
function GetLanguagesArray(const AJSON: String): TArray<String>;
var
LValue: TJSONValue;
LArray: TJSONArray;
i: Integer;
begin
Result := nil;
LValue := TJSONObject.ParseJSONValue(AJSON);
if LValue <> nil then
try
LArray := (LValue as TJSONObject).GetValue('languages') as TJSONArray;
SetLength(Result, LArray.Count);
for i := 0 to Pred(LArray.Count) do
begin
Result[i] := LArray[i].Value;
end;
finally
LValue.Free;
end;
end;
使用 REST.JSON 非常简单,使用帮助程序解析和读取数组项
type
TDeveloper = class
private
FAge : Integer;
FName : string;
FLanguages: TArray<string>;
public
property Age : Integer read FAge write FAge;
property Name : string read FName write FName;
property Languages: TArray<string> read FLanguages write FLanguages;
end;
// Sample
var
FDeveloper: TDeveloper;
FLanguage : string;
begin
try
FDeveloper := TJson.JsonToObject<TDeveloper>(Memo1.Text);
Memo2.Clear;
Memo2.Lines.Add('------------------------------ ');
Memo2.Lines.Add('Name: ' + FDeveloper.Name);
Memo2.Lines.Add('Age : ' + FDeveloper.Age.ToString);
for FLanguage in FDeveloper.Languages do
begin
Memo2.Lines.Add('------------------------------ ');
Memo2.Lines.Add(FLanguage);
end;
finally
FreeAndNil(FDeveloper);
end;
见图: [1]: https://i.stack.imgur.com/69Zao.png