首页 > 其他分享 >delphi JSON序列化(四)

delphi JSON序列化(四)

时间:2024-01-10 16:44:20浏览次数:26  
标签:fage end name delphi TObject JSON fname 序列化 string

涉及的重要类 REST.Json,REST.JsonReflect,REST.Json.Interceptors, REST.Json.Types单元中。

一、TJson类

最简单的一个类,提供了JSON -> OBJECT和OBJECT -> JSON几个方法,方法有TJsonOptions参数,如:

    class function ObjectToJsonObject(AObject: TObject; AOptions: TJsonOptions = CDefaultOptions): TJSONObject;

type
  TJsonOption = (joIgnoreEmptyStrings, joIgnoreEmptyArrays,
    joDateIsUTC, joDateFormatUnix, joDateFormatISO8601, joDateFormatMongo, joDateFormatParse,
    joBytesFormatArray, joBytesFormatBase64,
    joIndentCaseCamel, joIndentCaseLower, joIndentCaseUpper, joIndentCasePreserve,
    joSerialFields, joSerialPublicProps, joSerialPublishedProps, joSerialAllPubProps);
  TJsonOptions = set of TJsonOption;

TJsonOptions主要是控制一些转换细节,如日期类型的格式,Base64, 驼峰,属性的可见性等。

二、TConverter<TSerial> 类

这是一个抽象类,提供了序列化过程中的相关方法

三、  TJSONConverter = class(TConverter<TJSONValue>)

是TConverter<TSerial> 类的子类,实现了父类的抽象方法,同时也是默认的转换器。

四、TJSONMarshal和TJSONUnMarshal

这个类是正、反序列化的两个具体类。TJson内部就是使用这两个类完成工作的。

五、一些TCustomAttribute的子类

这些子类是“贴标签”用的,  如JSONMarshalledAttribute和JsonNameAttribute

  TPerson = class
  private
    fname: string;
    fage: Integer;
  public
    [JsonName('_new_name_')]
    property name: string read fname write fname;
    [JSONMarshalled(false)]
    property age: Integer read fage write fage;
  end;
//json结果 : {"_new_name_":"aaa"}

六、TJSONConverters类

这个类有几个静态方法,可以添加转换事件类。

七、TConverterEvent和TReverterEvent

这两个类是成对的,主要是定义了拦截事件。

八、TJSONInterceptor类

可以自定义不同的TJSONInterceptor子类,然后供JsonReflectAttribute属性标签用。

九、简单的示例

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Rest.JSON.Types, Rest.JsonReflect;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TTestInterceptor = class(TJSONInterceptor)
  public
    function StringConverter(Data: TObject; Field: string): string; override;  // 注意事项 2: 这个方法实现要追加的字符串。
    function TypeObjectConverter(Data: TObject): TObject; override;     //注意事项一:转换对象的这个方法一定要实现,
  end;

  [JSONSerialize(jmPublicProps)]  //
  [JsonReflect(ctTypeObject, rtTypeObject, TTestInterceptor)] //注意事项一:偷换了转换的对象,
  TPerson = class
  private
    fname: string;
    fage: Integer;
  public
    constructor Create(_name: string; _age: Integer);
    property name: string read fname write fname;
    property age: Integer read fage write fage;
  end;

  [JSONSerialize(jmPublicProps)]
  TPerson2 = class
  private
    fname: string;
    fage: Integer;
  public
    constructor Create;
    [JsonReflect(ctString, rtString, TTestInterceptor)]    //注意事项 2 :字符串属性内容转换。
    [JsonName('new_name_')]
    property name: string read fname write fname;
    [JSONMarshalled(false)]
    property age: Integer read fage write fage;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  REST.Json, System.Generics.Collections;

{ TPerson }

constructor TPerson.Create(_name: string; _age: Integer);
begin
  inherited Create;
  fname := _name;
  fage := _age;
end;

{ TPerson2 }

constructor TPerson2.Create;
begin
  inherited Create;
  fname := 'person222222';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  var p := TPerson.Create('aaa', 1);
  var jsonValue := TJson.ObjectToJsonObject(p, [joIndentCaseUpper]);  // 注意:自定义转换后,name不会转为大写。
  Memo1.Text := jsonValue.toString;
  p.Free;
end;

{ TTestInterceptor }

function TTestInterceptor.StringConverter(Data: TObject; Field: string): string;
begin
  Result := RTTIProvider.GetMember(Data, Field).GetValue(Data).AsString + '__新加的内容';
end;

function TTestInterceptor.TypeObjectConverter(Data: TObject): TObject;
begin
  //这里偷换为 person2.
  Result := TPerson2.Create;
end;

end.
View Code

结果:{"new_name_":"person222222__新加的内容"}

 

标签:fage,end,name,delphi,TObject,JSON,fname,序列化,string
From: https://www.cnblogs.com/Jiaojiawang/p/17956825

相关文章

  • JOSN字符串字段遍历(json-path)
    官网https://github.com/json-path/JsonPath依赖<dependency><groupId>com.jayway.jsonpath</groupId><artifactId>json-path</artifactId><version>2.5.0</version></dependency>......
  • netty: Marshalling序列化示例
    一、请求对象和响应对象,分别要实现Serializable接口packagecn.edu.tju;importjava.io.Serializable;publicclassUserRequestimplementsSerializable{privateStringusername;privateStringpassword;publicStringgetUsername(){returnus......
  • 如何在 Python 中安装 json 模块
    Python是一种功能强大的编程语言,自带了许多标准库,其中json模块是用于处理JSON数据的模块。在Python中安装json模块非常简单,因为它是标准库的一部分,不需要额外的安装步骤。JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,易于阅读和编写,并且易于机器解析和生成。Python的......
  • Java之序列化的详细解析
     3.序列化3.1概述Java提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反......
  • Django quertset、set的序列化
    一、几种序列化importjson#序列化querysetdefxuliehuaQueryset(request):querylist=models.LsTable.objects.all()querylist_json=serializers.serialize("json",querylist)returnHttpResponse(querylist_json)#序列化setdefxuliehuaQueryset(......
  • JSON中带多余反斜杠?原来是滥用FastJSON造成的!
    以前对接很多老系统的接口是发现对方返回的JSON往往有些不太对劲,例如{"key_1":"A","key_2":"{\"name\":\"Tom\"}"}由于以前我使用springBoot自带的Jackson,因此从未自己造成这种现象,然而最近在对接一个接口时,我自己使用FastJSON时恰巧就复制了一模一样的bug:我当时就......
  • 数据反序列化参数TypeReference
    使用jackson或者fastjson将json字符串反序列化成对象(以fastjson为例)TypeReference<AjaxResult<List<Person>>>typeReference=newTypeReference<AjaxResult<List<Person>>>(){};Stringjson="{\"code\":200,\"success\......
  • MySQL 8.0的SQL查询JSON返回的数据类型为字符串而非数组
    在MySQL8.0中,SQL查询JSON返回的数据类型确实是字符串,而不是数组。这是因为MySQL将JSON数据存储为字符串,并提供了一些函数和操作符来处理JSON数据。但是,你可以使用内置的JSON函数来处理返回的JSON字符串。例如,你可以使用JSON_EXTRACT函数来提取JSON字符串......
  • redis中序列化问题,value包含全路径类名解析
    1.问题redis中保存的key-value格式value直接存入的是实体对象,值中包含全路径类名,在使用Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer解析器时报错报错内容:com.fasterxml.jackson.databind.exc.InvalidTypeIdException:Couldnotresolvetypeid'entity.r......
  • 【设计模式】单例模式——反序列化破坏单例模式的情景
    一个单例对象创建好之后,有时候需要将对象序列化然后进行数据持久化,下次使用的时候通过反序列化转化为内存对象。反序列化后的对象会重新分配内存,会破坏单例模式。首先看支持序列化的单例类的代码://实现Serializable即可实现序列化和反序列化publicclassSingletonimplementsSe......