※請理解我英語不好,所以我使用翻譯來提問。※
您想要匯入并使用 JSON 陣列中的所有值。
但是,我在寫完代碼后完成了加載,但似乎只有第一個或最后一個值出來。添加陣列編號并嘗試了所有方法,但未收到任何值或發生錯誤。
在堆疊溢位中找到并使用了獲取 JSON 陣列中的值的代碼:Delphi parse JSON array or array
JSON 代碼與我的有點不同,但我對其進行了一些修改,它運行良好。但是,我問專家是因為只提出第一個或最后一個值是荒謬的。
//============JSON CODE===============
[
{
"VehicleWeight": "3.5?",
"AlightArea": "?? ??? ??? ???",
"Fee_Driver": "70000",
"LoadArea": "?? ??? ???",
"Commission": "0",
"LiveTime": "2022-08-19 09:39:05",
"AlightDate": "2022-08-19",
"LoadDate": "2022-08-19",
"GoodName": "",
"ActionName": "??",
"VehicleType": "??",
"sk": "data#",
"OrderCondition": "3",
"Transport_ID": "B2682B5FC09C4CE38F2F14C84C4829D1",
"pk": "B2682B5FC09C4CE38F2F14C84C4829D1#owner",
"MultiLoading": "0",
"Shipper_Name": "??????(?)"
},
{
"VehicleWeight": "5??",
"AlightArea": "?? ??? ???",
"Fee_Driver": "130000",
"LoadArea": "?? ??? ??? ???",
"Commission": "0",
"LiveTime": "2022-08-19 09:00:00",
"AlightDate": "2022-08-19",
"LoadDate": "2022-08-19",
"GoodName": "??",
"ActionName": "??",
"VehicleType": "??",
"sk": "data#",
"OrderCondition": "3",
"Transport_ID": "AB8D6C1ABA30497E95BD6FFF287E47A5",
"pk": "AB8D6C1ABA30497E95BD6FFF287E47A5#owner",
"MultiLoading": "0",
"Shipper_Name": "??????(?)"
},
{
"VehicleWeight": "2.5?",
"AlightArea": "?? ??? ???",
"Fee_Driver": "90000",
"LoadArea": "?? ??? ???",
"Commission": "0",
"LiveTime": "2022-08-19 11:06:24",
"AlightDate": "2022-08-19",
"LoadDate": "2022-08-19",
"GoodName": "",
"ActionName": "??",
"VehicleType": "??",
"sk": "data#",
"OrderCondition": "3",
"Transport_ID": "F103B2FC1A8B42C9BCB350A8041BCEA4",
"pk": "F103B2FC1A8B42C9BCB350A8041BCEA4#owner",
"MultiLoading": "0",
"Shipper_Name": "??????(?)"
},
{
"VehicleWeight": "5?",
"AlightArea": "?? ??? ???",
"Fee_Driver": "120000",
"LoadArea": "?? ??? ??? ???",
"Commission": "0",
"LiveTime": "2022-08-19 09:00:00",
"AlightDate": "2022-08-19",
"LoadDate": "2022-08-19",
"GoodName": "",
"ActionName": "??",
"VehicleType": "???",
"sk": "data#",
"OrderCondition": "3",
"Transport_ID": "C468AAC449B343CB8CB3349CD9FD46A7",
"pk": "C468AAC449B343CB8CB3349CD9FD46A7#owner",
"MultiLoading": "0",
"Shipper_Name": "??????(?)"
},
{
"VehicleWeight": "5?",
"AlightArea": "?? ???",
"Fee_Driver": "220000",
"LoadArea": "?? ??? ???",
"Commission": "0",
"LiveTime": "2022-08-19 10:03:16",
"AlightDate": "2022-08-19",
"LoadDate": "2022-08-19",
"GoodName": "",
"ActionName": "??",
"VehicleType": "??",
"sk": "data#",
"OrderCondition": "3",
"Transport_ID": "A89FE76963374084933E89C3BD4CB57C",
"pk": "A89FE76963374084933E89C3BD4CB57C#owner",
"MultiLoading": "0",
"Shipper_Name": "??????(?)"
},
{
"VehicleWeight": "5?",
"AlightArea": "?? ??? ???",
"Fee_Driver": "120000",
"LoadArea": "?? ??? ???",
"Commission": "0",
"LiveTime": "2022-08-19 09:46:20",
"AlightDate": "2022-08-19",
"LoadDate": "2022-08-19",
"GoodName": "7.5??",
"ActionName": "??",
"VehicleType": "???",
"sk": "data#",
"OrderCondition": "3",
"Transport_ID": "846A5E797D9E4A8097D816C83FE0034E",
"pk": "846A5E797D9E4A8097D816C83FE0034E#owner",
"MultiLoading": "0",
"Shipper_Name": "??????(?)"
},
{
"VehicleWeight": "5?",
"AlightArea": "?? ??? ???",
"Fee_Driver": "110000",
"LoadArea": "?? ??? ???",
"Commission": "0",
"LiveTime": "2022-08-19 11:00:00",
"AlightDate": "2022-08-19",
"LoadDate": "2022-08-19",
"GoodName": "",
"ActionName": "??",
"VehicleType": "??/???",
"sk": "data#",
"OrderCondition": "1",
"Transport_ID": "780F2633C16542809FBB96ADADFFBA35",
"pk": "780F2633C16542809FBB96ADADFFBA35#owner",
"MultiLoading": "0",
"Shipper_Name": "??????(?)"
}
]
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, IdSSL , IdSSLOpenSSL, HTTPApp , IdURI,
IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, System.JSON,
Vcl.Grids, Data.DB, Vcl.DBGrids;
type
TForm1 = class(TForm)
DateTimePicker1: TDateTimePicker;
Edit1: TEdit;
Button1: TButton;
IdHTTP1: TIdHTTP;
StringGrid1: TStringGrid;
editPK: TEdit;
Memo1: TMemo;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure StringGrid1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{Automatic column size adjustment}
procedure AutoSizeGridColumn(Grid : TStringGrid; column : integer);
var
i : integer;
temp : integer;
max : integer;
begin
max := 0;
for i := 0 to (Grid.RowCount-1) do
begin
// Among the width of each row in the specified column based on Grid Canvas
// The maximum value is determined by the width of the column
temp := Grid.Canvas.TextWidth(grid.cells[column, i]);
if temp > max then
max := temp;
end;
Grid.ColWidths[column] := max Grid.GridLineWidth 20;
end;
{End of autosize Column}
//*************************************************************
//==========================Get JSON array values=========================
function getData(JsonString: String; User: String; Field: String): String;
var
JSonValue: TJSonValue;
JsonArray: TJSONArray;
ArrayElement: TJSonValue;
FoundValue: TJSonValue;
begin
Result :='';
// create TJSonObject from string
JsonValue := TJSonObject.ParseJSONValue(JsonString);
// get the array
JsonArray := JsonValue as TJSONArray;
// iterate the array
for ArrayElement in JsonArray do begin
FoundValue := ArrayElement.FindValue(User);
if FoundValue <> nil then begin
Result := ArrayElement.GetValue<string>(Field);
break;
end;
end;
end;
//==========================End of getting JSON array values=========================
procedure TForm1.Button1Click(Sender: TObject);
var
idhttps: TIdHTTP;
sslIOHandler : TIdSSLIOHandlerSocketOpenSSL;
lStream : TStringStream;
JSONValue : TJSONValue;
JSONArray : TJSONArray;
JSONObject, JSONdata: TJSONObject;
JSONCount: integer;
RESULT : String;
ArrayElement: TJSonValue;
FoundValue: TJSonValue;
i : integer;
begin
Try
Result := '';
idhttps := TIdHTTP.Create();
lStream := TStringStream.Create(nil);
sslIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
Try
sslIOHandler.SSLOptions.Method := sslvSSLv23;
sslIOHandler.SSLOptions.Mode := sslmClient;
idhttps.IOHandler := sslIOHandler;
// idhttps.Request.CustomHeaders.Add(pAuthorization);
idhttps.HandleRedirects :=False;
idhttps.Request.Method := 'GET';
idhttps.Response.ContentType := 'application/json; charset=utf-8';
idhttps.ConnectTimeout := 10000;
idhttps.ReadTimeout := 10000;
lStream.Position := 0;
idhttps.Get('insert JSON URL', lStream, []);
Finally
Result := TEncoding.UTF8.GetString(lStream.Bytes,0, lStream.Size);
JsonArray := TJSONObject.ParseJSONValue(Result) as TJSONArray;
JSONCount := JsonArray.Count;
StringGrid1.RowCount := JSONCount 1;
for i := 0 to (jsonCount)-1 do
for ArrayElement in JsonArray do begin
StringGrid1.Cells[00,i 1] := getdata(Result, '', 'ActionName');//Status
StringGrid1.Cells[02,i 1] := getdata(Result, '', 'Shipper_Name');//Company Name
StringGrid1.Cells[03,i 1] := getdata(Result, '', 'LoadDate');//Different day
StringGrid1.Cells[04,i 1] := getdata(Result, '', 'LoadArea');//to take over
StringGrid1.Cells[05,i 1] := getdata(Result, '', 'AlightArea');//Downloading
StringGrid1.Cells[06,i 1] := getdata(Result, '', 'AlightDate');//Departure Day
StringGrid1.Cells[07,i 1] := getdata(Result, '', 'VehicleType');//model
StringGrid1.Cells[08,i 1] := getdata(Result, '', 'VehicleWeight');// tonnage
StringGrid1.Cells[09,i 1] := getdata(Result, '', 'GoodName');//Cargo information
StringGrid1.Cells[10,i 1] := getdata(Result, '', 'Fee_Driver');//vehicle freight
StringGrid1.Cells[11,i 1] := getdata(Result, '', 'Commission');//commission
StringGrid1.Cells[12,i 1] := getdata(Result, '', 'sk');//pk
StringGrid1.Cells[13,i 1] := getdata(Result, '', 'pk');//sk
{if StringGrid1.Cells[13,i 1] = '300016244318#9977' then
begin
StringGrid1.Cells[01,i 1] := 'O'//????
end
else
begin
StringGrid1.Cells[01,i 1] := '';//????
end; }
end;
{StringGrid1 Auto-Size Cell}
for i := 0 to StringGrid1.ColCount-1 do
begin
AutoSizeGridColumn(StringGrid1, i);
end;
{StringGrid1 Auto-Size Cell END}
FreeAndNil(lStream);
FreeAndNil(idhttps);
FreeAndNil(sslIOHandler);
End;
except
on E: EIdHTTPProtocolException do
begin
Result := e.ErrorMessage;
FreeAndNil(idhttps);
FreeAndNil(sslIOHandler);
end;
End;
end;
end.
uj5u.com熱心網友回復:
我在這段代碼中看到了很多問題。
在Button1Click()中,外部for回圈是不必要的,應該洗掉。在這兩個for回圈之間,您正在不必要地一遍又一遍地重新回圈通過同一個陣列。內for..in回圈就足夠了。
getValue()此外,將原始 JSON 作為字串是沒有意義的,因為Button1Click()已經將其決議出來,只是getValue()一次又一次地重新決議它。大量浪費的開銷。您應該傳遞現有的TJSONArray甚至是ArrayElementto getValue()(或者更好的是,完全消除getValue()并將其邏輯直接移入Button1Click,特別是因為您的呼叫FindValue(User)沒有意義,因為User總是空白)。
此外,getData()并且Button1Click()都泄漏了回傳的TJSONValue物件ParseJSONValue()。
此外,您應該使用TIdHTTP.Get()回傳 astring而不是填充 a的多載TStream。
此外,您try..finally的 s 需要進行一些清理,您沒有充分保護所有物件免受錯誤的影響。
綜上所述,嘗試更多類似的東西:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, IdSSL , IdSSLOpenSSL, HTTPApp , IdURI,
IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, System.JSON,
Vcl.Grids, Data.DB, Vcl.DBGrids;
type
TForm1 = class(TForm)
DateTimePicker1: TDateTimePicker;
Edit1: TEdit;
Button1: TButton;
IdHTTP1: TIdHTTP;
StringGrid1: TStringGrid;
editPK: TEdit;
Memo1: TMemo;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure StringGrid1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{Automatic column size adjustment}
procedure AutoSizeGridColumn(Grid : TStringGrid; Column : integer);
var
i : integer;
temp : integer;
max : integer;
begin
max := 0;
for i := 0 to Grid.RowCount-1 do
begin
// Among the width of each row in the specified column based on Grid Canvas
// The maximum value is determined by the width of the column
temp := Grid.Canvas.TextWidth(Grid.Cells[Column, i]);
if temp > max then
max := temp;
end;
Grid.ColWidths[Column] := max Grid.GridLineWidth 20;
end;
{End of autosize Column}
//*************************************************************
procedure TForm1.Button1Click(Sender: TObject);
var
idhttps: TIdHTTP;
sslIOHandler : TIdSSLIOHandlerSocketOpenSSL;
JSONValue : TJSONValue;
JSONArray : TJSONArray;
ArrayElement: TJSONValue;
i : integer;
begin
idhttps := TIdHTTP.Create;
try
sslIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(idhttps);
sslIOHandler.SSLOptions.Mode := sslmClient;
sslIOHandler.SSLOptions.Method := sslvSSLv23;
idhttps.IOHandler := sslIOHandler;
// idhttps.Request.CustomHeaders.Add(pAuthorization);
idhttps.HandleRedirects := False;
idhttps.ConnectTimeout := 10000;
idhttps.ReadTimeout := 10000;
idhttps.HTTPOptions := idhttps.HTTPOptions [hoNoProtocolErrorException, hoWantProtocolErrorContent];
Result := idhttps.Get('insert JSON URL');
finally
idhttps.Free;
end;
JSONValue := TJSONObject.ParseJSONValue(Result);
try
JsonArray := JSONValue as TJSONArray;
StringGrid1.RowCount := JsonArray.Count 1;
i := 1;
for ArrayElement in JsonArray do
begin
StringGrid1.Cells[00,i] := ArrayElement.GetValue<string>('ActionName','');//Status
StringGrid1.Cells[02,i] := ArrayElement.GetValue<string>('Shipper_Name','');//Company Name
StringGrid1.Cells[03,i] := ArrayElement.GetValue<string>('LoadDate','');//Different day
StringGrid1.Cells[04,i] := ArrayElement.GetValue<string>('LoadArea','');//to take over
StringGrid1.Cells[05,i] := ArrayElement.GetValue<string>('AlightArea','');//Downloading
StringGrid1.Cells[06,i] := ArrayElement.GetValue<string>('AlightDate','');//Departure Day
StringGrid1.Cells[07,i] := ArrayElement.GetValue<string>('VehicleType','');//model
StringGrid1.Cells[08,i] := ArrayElement.GetValue<string>('VehicleWeight','');// tonnage
StringGrid1.Cells[09,i] := ArrayElement.GetValue<string>('GoodName','');//Cargo information
StringGrid1.Cells[10,i] := ArrayElement.GetValue<string>('Fee_Driver','');//vehicle freight
StringGrid1.Cells[11,i] := ArrayElement.GetValue<string>('Commission','');//commission
StringGrid1.Cells[12,i] := ArrayElement.GetValue<string>('sk','');//pk
StringGrid1.Cells[13,i] := ArrayElement.GetValue<string>('pk','');//sk
{if StringGrid1.Cells[13,i] = '300016244318#9977' then
begin
StringGrid1.Cells[01,i] := 'O'//????
end else begin
StringGrid1.Cells[01,i] := '';//????
end;}
Inc(i);
end;
finally
JSONValue.Free;
end;
{StringGrid1 Auto-Size Cell}
for i := 0 to StringGrid1.ColCount-1 do
begin
AutoSizeGridColumn(StringGrid1, i);
end;
{StringGrid1 Auto-Size Cell END}
end;
end.
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/503921.html
上一篇:確定DateTime編碼或格式
