将JSON导入TFDMemTable

时间:2019-04-19 18:21:06

标签: json delphi

我正在尝试将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。我该如何解决?

1 个答案:

答案 0 :(得分:1)

您忘记添加

`FDMemTable1.CreateDataSet;`

FDMemTable1.FieldDefs.Add('ServiceDate', ftString, 10);

这意味着您的dataSet字段尚未创建,因此调用

FDMemTable1.FieldByName('userId').AsString

将返回nil并在分配给它时抛出EV

添加该行,您就很好了

请参见吉姆·麦基思(Jim McKeeth)的this guide(视频下的代码),以了解使用TMemTable的正确方法及其作用。