Delphi:使用TJson.JsonToObject反序列化TList <t>

时间:2019-01-17 17:05:50

标签: delphi

考虑此测试课程:

TUser = class
  Name: string;
  constructor Create(AName: string);
end;

TTestClass = class
  Users:  TList<TUser>;
  constructor Create;
end;

序列化为JSON可以正常工作,但是当我尝试将其反序列化时,该列表未填充:

procedure TForm21.Button1Click(Sender: TObject);
var
  u: TUser;
begin
  TestClass := TTestClass.Create;
  TestClass.Users.Add( TUser.Create('Nick'));
  TestClass.Users.Add( TUser.Create('Mike'));

  Memo1.Text := TJson.ObjectToJsonString(TestClass);
  TestClass2 := TJson.JsonToObject<TTestClass>( Memo1.Text );

  for u in TestClass2.Users do
    Memo1.Lines.Add(Format('User %s ', [ u.Name ]));
end;

JSON输出为:

{"users":{"listHelper":[2],"items":[["Nick"],["Mike"]]}}

1 个答案:

答案 0 :(得分:1)

字段名称通常以“ f”为前缀。 将“用户”重命名为“ fUsers”后,您的代码即可使用。

了解这一点很简单。 f在json中看起来不太好。我想这就是为什么他们在生成json时将其删除,而在解析json时将其添加的原因,将其删除。

请参阅REST.JsonReflect单元 方法: TJSONUnMarshal.ConvertFieldNameFromJson 和 TJSONConverter.ConvertFieldNameToJson