将JSON导入到TFDMemTable

4
我正在尝试将JSON从TMemo导入到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寻址不正确。 我该如何解决这个问题?


请检查“userId”和“PutRequest.Item.userId”的返回值是否有效,因为例如如果“UserId”不是AsString,则会返回nil,因此将其分配给它将会抛出异常。在调试器中通过悬停在它们的属性上尝试一下。 - Nasreddine Galfout
尝试对此行进行注释,看看下面的行是否也会抛出异常。 - Nasreddine Galfout
@Nasreddine Galfout - 我按照你的建议添加了 FDMemTable1.CreateDataSet;,但现在当我将数据分配给字段时却出现了访问冲突错误。我检查了值,但使用 ''PutRequest.Item.userId" 并没有得到任何结果。甚至我尝试了 oProd.GetValue('PutRequest').Value;,但还是没有值。 - Hackbrew
@Nasreddine Galfout - "ShowMessage('oProd = ' + oProd.ToString);" 可以显示 JSON 数组的内容。 - Hackbrew
正如您所看到的,这变成了一个调试问题,我建议您研究如何使用TJSONObject.ParseJSONValue()等方法。首先,您似乎忽略了返回值,它可能为nil,并确保您的代码与JSON中的结构匹配。 - Nasreddine Galfout
显示剩余2条评论
1个回答

4
您忘记添加了


`FDMemTable1.CreateDataSet;`

在...

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

这意味着您的数据集字段尚未创建,因此调用无法完成。
FDMemTable1.FieldByName('userId').AsString

当对其进行赋值时,它将返回nil并抛出EV

添加这行代码,你就可以开始了

请查看Jim McKeeth的指南(视频下方的代码),以了解正确使用TMemTable及其功能。


至少在10.3版本中,帮助文档中提到:“可选地,可以将数据集的Active属性设置为True来创建数据集。” - Brian
@Brian 嗯,我用的是10.2版本,从来没有尝试过你所说的方法,谢谢你的评论,这意味着我需要再快速了解一下这些内容 :)。 - Nasreddine Galfout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接