如何在 Delphi 中解析 JSON 字符串?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4350886/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to parse a JSON string in Delphi?
提问by Salvador
How can I parse the JSON string
如何解析 JSON 字符串
{"data":{"results":[{"Branch":"ACCT590003"}]}}
using the TJSONObjectobject? I want to get the ACCT590003value from this string.
使用TJSONObject对象?我想ACCT590003从这个字符串中获取值。
回答by Chau Chee Yang
uses
SysUtils,
DBXJSON;
type
TProcessJSONString = TProc<TJSONString>;
procedure DoJSONObject(o: TJSONObject; Process: TProcessJSONString); forward;
procedure DoJSONArray(o: TJSONArray; Process: TProcessJSONString);
var i: integer;
v: TJSONValue;
begin
for i := 0 to o.Size - 1 do begin
v := o.Get(i);
if v is TJSONObject then
DoJSONObject(v as TJSONObject, Process);
end;
end;
procedure DoJSONObject(o: TJSONObject; Process: TProcessJSONString);
var i: integer;
p: TJSONPair;
begin
for i := 0 to o.Size - 1 do begin
p := o.Get(i);
Process(p.JsonString);
if p.JsonValue is TJSONObject then
DoJSONObject(p.JsonValue as TJSONObject, Process)
else if p.JsonValue is TJSONArray then
DoJSONArray(p.JsonValue as TJSONArray, Process)
else if p.JsonValue is TJSONString then
Process(p.JsonValue as TJSONString);
end;
end;
var o: TJSONObject;
begin
o := TJSONObject.ParseJSONValue('{"data":{"results":[{"Branch":"ACCT590003"}]}}') as TJSONObject;
try
DoJSONObject(o,
procedure (o: TJSONString)
begin
WriteLn(o.ToString);
end
);
finally
o.Free;
end;
ReadLn;
end.
回答by jaruzafa
You don't need to use external libraries to perform a JSONPath search. Example with Delphi 10 Seattle:
您不需要使用外部库来执行 JSONPath 搜索。Delphi 10 Seattle 的示例:
uses System.JSON;
procedure ParseJSonValue;
var
JSonValue:TJSonValue;
st:string;
Branch: string;
begin
st := '{"data":{"results":[{"Branch":"ACCT590003"}]}}';
JsonValue := TJSonObject.ParseJSONValue(st);
Branch := JsonValue.GetValue<string>('data.results[0].Branch');
JsonValue.Free;
end;
回答by Simoh
Try this code, it works fine
试试这个代码,它工作正常
uses System.JSON;
procedure _Parse_JSonValue;
var
JSonObject:TJSonObject;
JSonValue:TJSonValue;
st:string;
Branch: string;
Begin
st := '{"data":{"results":[{"Branch":"ACCT590003"}]}}';
JSonObject := TJSonObject.Create;
JsonValue:=JSonObject.ParseJSONValue(st);
JsonValue:=(JsonValue as TJSONObject).Get('data').JSONValue;
JsonValue:=(JsonValue as TJSONObject).Get('results').JSONValue;
if (JSONValue is TJSONArray) then
Branch := ((JSONValue as TJSONArray).Items[0] as TJSonObject).Get('Branch').JSONValue.Value;
JSonObject.Free;
End;
Branch = 'ACCT590003'
分支 = 'ACCT590003'
回答by loki
using TALdocumentit's easy
使用TALdocument很容易
AJsonDoc := TalJsonDocument.create;
AjsonDoc.loadFromJsonString('{"data":{"results":[{"Branch":"ACCT590003"}]}}');
writeln(AjsonDoc.childnode['data']['result'][0]['Branch'].text);
回答by Arioch 'The
Using SuperObject Library https://github.com/hgourvest/superobject/
使用 SuperObject 库https://github.com/hgourvest/superobject/
var json: iSuperObject;
data: string;
begin
json := SO('{"data":{"results":[{"Branch":"ACCT590003"}]}}'); // shorthand
// or equal: JSON := TSuperObject.ParseString('{"data":{"results":[{"Branch":"ACCT590003"}]}}');
data := json.S['data.results[0].Branch'];
WriteLn('Result is: ', data);
end.

