我正在尝试将TMemo中的JSON导入TFDMemTable。执行后,出现“ Exception EAccessViolation ...”错误。似乎引起问题的代码行是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。我该如何解决?
答案 0 :(得分:1)
您忘记添加
`FDMemTable1.CreateDataSet;`
在
下FDMemTable1.FieldDefs.Add('ServiceDate', ftString, 10);
这意味着您的dataSet字段尚未创建,因此调用
FDMemTable1.FieldByName('userId').AsString
将返回nil并在分配给它时抛出EV
添加该行,您就很好了
请参见吉姆·麦基思(Jim McKeeth)的this guide(视频下的代码),以了解使用TMemTable
的正确方法及其作用。