delphi 实体类 与JSON转换,序列化

TJson
REST.JSON.pas
System.JSON.Serializers,
 
TJson.JsonToObject
TJson.ObjectToJsonString
JsonEncode
ObjectToJsonObject
 
http://docwiki.embarcadero.com/Libraries/Seattle/en/REST.Json.TJson_Methods
 
 
 从JSONArray中获得JSONObject对象
   JSONObject   jsonObject = (JSONObject)jsonArray.get(i);
 

TJsonReader\TJsonTextWriter

uses System.JSON.Readers,System.JSON.Writers

http://docwiki.embarcadero.com/Libraries/Seattle/en/System.JSON.Readers

http://docwiki.embarcadero.com/Libraries/Seattle/en/System.JSON.Writers

http://docwiki.embarcadero.com/Libraries/Seattle/en/System.JSON.Readers.TJsonReader

http://docwiki.embarcadero.com/Libraries/Seattle/en/System.JSON.Writers.TJsonTextWriter

http://docwiki.embarcadero.com/Libraries/Seattle/en/System.JSON.Readers.TJsonReader_Methods
http://docwiki.embarcadero.com/Libraries/Seattle/en/System.JSON.Writers.TJsonTextWriter_Methods
 
来源
http://www.malcolmgroves.com/blog/?p=1084
http://stackoverflow.com/questions/21528552/how-to-bind-contained-objects-with-live-binding
https://community.embarcadero.com/blogs/entry/xe3-visual-livebindings-user-defined-c-objects-32002
 

unit CollectionObjects;

interface

type
TPerson = class
private
FAge: Integer;
FLastName: string;
FFirstName: string;
public
constructor Create(const FirstName, LastName: String; Age: Integer);
property FirstName: string read FFirstName write FFirstName;
property LastName: string read FLastName write FLastName;
property Age: Integer read FAge write FAge;
end; implementation { TPerson } constructor TPerson.Create(const FirstName, LastName: String; Age: Integer);
begin
FFirstName := FirstName;
FLastName := LastName;
FAge := Age;
end;
fMyPeople: TObjectList<TPerson>;

fMyPeople := TObjectList<TPerson>.Create(True);

// The individual TPerson objects
fMyPeople.Add(TPerson.Create('Gomez', 'Addams', ));
fMyPeople.Add(TPerson.Create('Morticia', 'Addams', ));
fMyPeople.Add(TPerson.Create('Pugsley', 'Addams', ));
fMyPeople.Add(TPerson.Create('Wednesday', 'Addams', )); // Use TObjectBindSourceAdapter for a single object
ABindSourceAdapter := TListBindSourceAdapter<TPerson>.Create(Self, FMyPeople, True); function PrettyJSON(AJson: String): String;
begin
Result := StringReplace(AJson, '},', '},' + sLineBreak, [rfReplaceAll]);
Result := StringReplace(Result, '[{', '[' + sLineBreak + '{', [rfReplaceAll]);
end; procedure TABSMainForm.JsonToObjects;
var
NewPeople: TObjectList<TPerson>;
begin
NewPeople := TJson.JsonToObject<TObjectList<TPerson>>(Memo1.Text);
fMyPeople.Clear;
fMyPeople.AddRange(NewPeople.ToArray);
end; procedure TABSMainForm.ObjectsToJson;
begin
Memo1.Text := PrettyJSON(TJson.ObjectToJsonString(fMyPeople));
end;

JsonToObject

ObjectToJsonString

JSON字符串转换为对象

{"ownsObjects":true,"listHelper":[9],"items":[
{"age":40,"lastName":"Addams","firstName":"Gomez"},
{"age":38,"lastName":"Addams","firstName":"Morticia"},
{"age":8,"lastName":"Addams","firstName":"Pugsley"},
{"age":12,"lastName":"Addams","firstName":"Wednesday"},
{"age":55,"lastName":"Fester","firstName":"Uncle"},
{"age":72,"lastName":"Frump","firstName":"Grandmama"},
{"age":50,"lastName":"Lurch","firstName":""},
{"age":99,"lastName":"Thing","firstName":"Thing T."},
{"age":21,"lastName":"Itt","firstName":"Cousin"},
null,null,null,null,null,null,null]}

TJson::ObjectToJsonString();

数据集转为Json

DataSetConverter4Delphi

https://github.com/ezequieljuliano/DataSetConverter4Delphi

Object>JsonString 类对象序列化为json字符串。

TPerson=class()....

string astr:= TJson.ObjectToJsonString(person);

JsonString反序列化 实例化为类对象

person := TJson.JsonToObject<TPerson>(astr);

Tokyo 10.2新增类,效率更高更快。

TJsonSerializer

Serializer:=TJsonSerializer.Create

String astr=Serializer.Serialize<TPerson>(aperson);

person= nSeriallizer.Deserialize<T>(astring);

感觉TJsonSerializer与.net的开源Newtonsoft.Json类似,功能基本相同了。

TJsonSerializer在c++builder的应用

https://community.embarcadero.com/blogs/entry/10-2-tokyo-tjsonserializer-and-json-converters

First declare with Pascal to use the converter and generics.

////
unit Unit2; interface
uses
System.JSON.Converters, System.JSON.Serializers, System.Generics.Collections;
type
TListString = TList<String>;
TDictionaryStrStr = class(TDictionary<String, String>)
constructor Create; overload; end;
TTJsonListConverterString = TJsonListConverter<String>;
TJsonDictionaryConverterStrStr = class(TJsonStringDictionaryConverter<String>)
end; This is because the use of generics in C++Builder. C++Builder used Win64. ////
#include <System.JSON.Converters.hpp>
#include <System.JSON.Serializers.hpp>
#include <System.Generics.Collections.hpp>
#include <System.JSON.Writers.hpp>
#include <memory>
 
////
template <typename T1, typename T2>
struct jCollections
{
UnicodeString _property_name{L""};
std::unique_ptr<TStringWriter> _string_write{std::make_unique<TStringWriter>()};
std::unique_ptr<TJsonSerializer> _j_serializer{std::make_unique<TJsonSerializer>()};
std::unique_ptr<TJsonTextWriter> _json_writer{std::make_unique<TJsonTextWriter>(_string_write.get())};
jCollections(UnicodeString lname)
{
///Constructor.
///Determine the property name.
_property_name = lname;
}
String listtoj(T1 l_list)
{
///Start of object and setting property name.
_json_writer->WriteStartObject();
_json_writer->WritePropertyName(_property_name);
///TJsonListConverter__1 or TJsonDictionaryConverterStrStr.
std::unique_ptr<T2 > l_json_conv{std::make_unique<T2 >()}; ///Here convert the value of the input list.
l_json_conv->WriteJson(_json_writer.get(), TValue::_op_Implicit(l_list), _j_serializer.get());
_json_writer->WriteEndObject();
///returns a string.
return _string_write->ToString();
} };
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TList__1<String>* l_list= new TList__1<String>();
try
{
jCollections<TList__1<String>*, TJsonListConverter__1<String> > _jCollections{L"language_List"};
l_list->Add("Python");
l_list->Add("Delphi");
l_list->Add("C++");
l_list->Add("JAVA");
l_list->Add("ひまわり");
Memo1->Lines->Append(_jCollections.listtoj(l_list) );
}
__finally
{
delete l_list;
} }
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TDictionaryStrStr* l_dic = new TDictionaryStrStr();
try
{
jCollections<TDictionaryStrStr*, TJsonDictionaryConverterStrStr > _jCollections{L"2017_MotoGP_standings"};
l_dic->Add("Maverick Vinales", "Movistar Yamaha");
l_dic->Add("Andrea Dovizioso", "Ducati");
l_dic->Add("Valentino Rossi", "Movistar Yamaha");
l_dic->Add("Marc Marquez", "Repsol Honda Team");
l_dic->Add("Dani Pedrosa", "Repsol Honda Team");
Memo1->Lines->Append(_jCollections.listtoj(l_dic));
}
__finally
{
delete l_dic;
} }

Button1 is TList<String> to JSON Convert. Button2 is TDictionary<String, String>to JSON.

3.数组json

  TUser = class
public
FAge: Integer;
FLastName: string;
FFirstName: string; end;

TJsonSerializer的序列化操作,class和 record都支持,使用起来太方便了。

数组2json

procedure TForm3.Button14Click(Sender: TObject);
var
user: TUser;
userList: TArray<TUser>;
begin
user := TUser.Create;
user.FAge := ;
user.FFirstName := 'delphi';
user.FLastName := 'berlin'; SetLength(userList, ); userList[] := user; user := TUser.Create;
user.FFirstName := 'delphi';
user.FAge := ;
user.FLastName := 'tokyo'; userList[] := (user);
self.Memo1.Text := TJsonSerializer.Create.Serialize(userList); end;

json2数组

procedure TForm3.Button15Click(Sender: TObject);
var
userList: TArray<TUser>;
user: TUser;
i: TArray<Integer>;
begin
userList := TJsonSerializer.Create.Deserialize < TArray < TUser >> (Memo1.Text); Memo2.Clear;
for user in userList do
begin
Memo2.Lines.Add(user.FAge.ToString);
Memo2.Lines.Add(user.FFirstName);
Memo2.Lines.Add(user.FLastName);
end; end;

delphi 实体类 JSON 数组的更多相关文章

  1. Fastjson 实体类JSON化过滤字段操作-PropertyFilter

    过滤实体类中年龄等于5的字段 List<Users> models=new ArrayList<>(); for(int i=0;i<11;i++){ Users mod ...

  2. 实体类Json串转成DataTable

    private DataTable GetJsonToDataTable(string json) { List<Object_DeclareInfo> arrayList = JsonC ...

  3. mvc web api 保存多个实体类的方法

    先说一下我的业务需求,挺简单的. 就是在设计角色和权限的页面中,需要一个角色对应多条权限记录,那么在保存的时候,我的处理方式是,先删除该角色的所有权限,然后再保存所有的权限. 这样的话问题就来了,用默 ...

  4. [LINQ2Dapper]最完整Dapper To Linq框架(三)---实体类关系映射

    此特性需要安装Kogel.Dapper.Mssql或者Oracle 3.06及以上版本,实体类层需要安装Kogel.Dapper.Extension 3.06及以上版本 目录 [LINQ2Dapper ...

  5. JSON-JSON字符串转换成JSON对象、JSON对象数组、java实体类以及保存到List列表中

    处理JSON字符串时,一直出错,写个样例后发现原来是没有弄清楚数据的格式问题. 实现的是 JSONString 转换成java对象 或是 list列表 实例类 News package lyx.ent ...

  6. .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...

  7. JSon实体类快速生成插件 GsonFormat 1.2.0

    写在前头:本插件只适用 android studio和 Intellij IDEA 工具,eclipse 的少年无视我吧!!! 这是一个根据JSONObject格式的字符串,自动生成实体类参数. gi ...

  8. 将JSON数据转换成JAVA的实体类

    思路:首先将JSON格式的数据转换成JSONObject,然后将JSONObject转换成Java的实体类(其中类属性包括List等类型) Java实体类: SearchFilter 类 1 publ ...

  9. c# json数据解析——将字符串json格式数据转换成对象或实体类

    网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过例子由易到难总结一下处理过程,希望能帮到和我一样开始不会的朋 ...

随机推荐

  1. 流量监控iftop安装-CentOS7

    继之前撘的服务器后路由器一直崩溃,今天找到了原因.之前被下的木马并没有被删掉,而是一直在传输数据.占用了所有宽带. 官网(http://www.ex-parrot.com/pdw/iftop/down ...

  2. Linux命令详解-type

    type命令用来显示指定命令的类型. 一个命令的类型可以是如下之一     alias     别名     keyword 关键字,Shell保留字     function 函数,Shell函数 ...

  3. UVALive-3126 Taxi Cab Scheme (DAG的最小路径覆盖)

    题目大意:要给n个人安排车,已知每个人的出发时间和起点与终点,问最少需要安排几辆车才能完成任务. 题目分析:最小路径覆盖.如果送完a到目的地后能在b出发之前赶来接b,那么连一条有向边a->b,最 ...

  4. LINUX QQ2(转载)

    关于这个话题,小编写过多次文章,也是很多朋友关心的问题. 前几日,由于小编手贱,升级Wordpress后不满意,只得重装旧版本的Wordpress,却忘了备份网站图片,导致损失惨重.近日都没有写新文章 ...

  5. 校验基于EO的VO中的字段是否发生变化

    I have a table region and there are multiple records fetching from a Entity based VO. Now I have upd ...

  6. BZOJ1074 [SCOI2007]折纸origami

    我们先看每个点可能从哪些点折过来的,2^10枚举对角线是否用到. 然后再模拟折法,查看每个点是否满足要求. 恩,计算几何比较恶心,还好前几天刚写过一道更恶心的计算几何,点类直接拷过来2333. /** ...

  7. 从客户端中检测到有潜在危险的 Request.Form 值 方法

    由于在.net中,Request时出现有HTML或Javascript等字符串时,系统会认为是危险性值.立马报出“从客户端 中检测到有潜在危险的Request.Form值”这样的错. 解决方案一:   ...

  8. python的单元测试代码编写流程

    单元测试: 单元测试是对单独的代码块分别进行测试, 以确保它们的正确性, 单元测试主要还是由开发人员来做, 其余的集成测试和系统测试由专业的测试人员来做. python的单元测试代码编写主要记住以下几 ...

  9. L183 Chinese company unveils first satellite for free WiFi

    A Chinese internet technology company unveiled the first satellite in a constellation plan to provid ...

  10. sublime text2下配置c++

    今天安装了sublime text2,真是编辑神器,不再用notepad了. 笔记本上没有c++运行环境,用编辑器既轻巧,又方便,VS太臃肿了. 要在sublime text2 下运行c++程序,需要 ...