jjw

写给自己的博客。 记录学习的点滴以备查。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

delphi 自带 的JOSN 序列化 三

Posted on 2023-08-14 18:28  jjw  阅读(203)  评论(0编辑  收藏  举报
  TConverterEx<T: class> = class(TJsonConverter)
  public
    function CanConvert(ATypeInf: PTypeInfo): Boolean; override;
    function ReadJson(const AReader: TJsonReader; ATypeInf: PTypeInfo; const AExistingValue: TValue;
      const ASerializer: TJsonSerializer): TValue; override;
    procedure WriteJson(const AWriter: TJsonWriter; const AValue: TValue;
      const ASerializer: TJsonSerializer); override;
  end;

{ TConverterEx<T> }

function TConverterEx<T>.CanConvert(ATypeInf: PTypeInfo): Boolean;
begin
  Result := ATypeInf = TypeInfo(TObjectList<T>); 
end;

function TConverterEx<T>.ReadJson(const AReader: TJsonReader;
  ATypeInf: PTypeInfo; const AExistingValue: TValue;
  const ASerializer: TJsonSerializer): TValue;
begin
  raise Exception.Create('未实现');
end;

procedure TConverterEx<T>.WriteJson(const AWriter: TJsonWriter;
  const AValue: TValue; const ASerializer: TJsonSerializer);
begin
  if AValue.IsObjectInstance then
  begin
    var L := AValue.AsObject as TObjectList<T>;
    AWriter.WriteStartArray;
    for var I := 0 to L.Count - 1 do
      ASerializer.Serialize<T>(AWriter, L[I]);
    AWriter.WriteEndArray;
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  var s := TJsonSerializer.Create;
  s.Formatting := TJsonFormatting.Indented;
  s.ContractResolver := TJsonDefaultContractResolver.Create(TJsonMemberSerialization.Public);
  s.Converters.Add(TConverterEx<TObjectValue>.Create);  //一次注册,不用到处贴签了
  var obj := TTestObject.Create;
  var jsonString := s.Serialize<TTestObject>(obj);
  Memo1.Lines.Add(jsonString);
  s.Free;
end;