我正在尝试将JSON从TMemo导入到TFDMemTable。执行时出现“Exception EAccessViolation…”错误。似乎引起问题的代码行是
这是我的JSON数组:
FDMemTable1.FieldByName('userId').AsString := oProd.GetValue('PutRequest.Item.userId').Value;
,这是我向FDMemTable添加第一条记录的地方。我检查了JSON,它似乎格式正确。这是我的JSON数组:
{"Jobs":[{"PutRequest":{"Item":{"userId":{"S":"1"},"WorkOrder":{"S":"29236"},"ServiceDate":{"S":"4/12/2019"}}}},{"PutRequest":{"Item":{"userId":{"S":"1"},"WorkOrder":{"S":"29237"},"ServiceDate":{"S":"4/12/2019"}}}}]}
以下是我的代码片段:
uses
System.JSON;
procedure TForm1.FormCreate(Sender: TObject);
var
oJson: TJSONObject;
oArr: TJsonArray;
oPair: TJSONPair;
i: Integer;
oProd: TJSONObject;
begin
FDMemTable1.FieldDefs.Add('userId', ftString, 5);
FDMemTable1.FieldDefs.Add('WorkOrder', ftString, 5);
FDMemTable1.FieldDefs.Add('ServiceDate', ftString, 10);
FDMemTable1.Active := True;
oJson := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(Memo1.Lines.Text), 0) as TJSONObject;
try
oArr := oJson.Get('Jobs').JsonValue as TJSONArray;
for i := 0 to oArr.Count - 1 do begin
oProd := oArr.Items[i] as TJSONObject;
FDMemTable1.Append;
FDMemTable1.FieldByName('userId').AsString := oProd.GetValue('PutRequest.Item.userId').Value;
FDMemTable1.FieldByName('WorkOrder').AsString := oProd.GetValue('PutRequest.Item.WorkOrder').Value;
FDMemTable1.FieldByName('ServiceDate').AsString := oProd.GetValue('PutRequest.Item.ServiceDate').Value;
FDMemTable1.Post;
end;
finally
oJson.Free;
end;
end;
我已经检查了"oArr"和"oProd"的赋值,看起来是正确的。 我猜想在尝试将值分配给FDMemTable时我的JSON寻址不正确。 我该如何解决这个问题?
FDMemTable1.CreateDataSet;
,但现在当我将数据分配给字段时却出现了访问冲突错误。我检查了值,但使用 ''PutRequest.Item.userId" 并没有得到任何结果。甚至我尝试了oProd.GetValue('PutRequest').Value;
,但还是没有值。 - HackbrewTJSONObject.ParseJSONValue()
等方法。首先,您似乎忽略了返回值,它可能为nil,并确保您的代码与JSON中的结构匹配。 - Nasreddine Galfout