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. jspf、jsp小记

    jsp页面:

  2. 前端工程构建工具——Yeoman

    一.Yeoman 简介 通常在开发新项目时我们都需要配置工程环境,开发目录,需要下载一些库.框架文件(如 jQuery.Backbone 等),配置编译环境(Less.Sass.Coffeescrip ...

  3. SGU 140. Integer Sequences 线性同余,数论 难度:2

    140. Integer Sequences time limit per test: 0.25 sec. memory limit per test: 4096 KB A sequence A is ...

  4. 【LeetCode 232_数据结构_队列_实现】Implement Queue using Stacks

    class Queue { public: // Push element x to the back of queue. void push(int x) { while (!nums.empty( ...

  5. 作业要求 20181030-1 Alpha发布用户使用报告

    作业链接[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2325] 队名:二次元梦之队 组长:刘莹莹 组员:周昊 潘世维  王玉潘 赵美增 ...

  6. w3m使用小记

    By francis_hao    Mar 8,2017   w3m是一个基于文本的web浏览器和分页器,运行在unix和windows系统上. 可显示包含链接的超文本标记语言(HTML),显示效果如 ...

  7. Oracle(一)安装

    一.到官网或者哪里去下载Oracle,我下的是winX64的11g版本 官网:https://www.oracle.com/technetwork/database/enterprise-editio ...

  8. C++ int转string(stringstream可转更多类型)

    一.使用atoi 说明: itoa(   int   value,   char   *string,   int   radix   );      第一个参数:你要转化的int;      第二个 ...

  9. .NET IL指令速查表

    名称 说明 Add 将两个值相加并将结果推送到计算堆栈上. Add.Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上. Add.Ovf.Un 将两个无符号整数值相加,执行溢出检查,并且 ...

  10. [BZOJ3162]独钓寒江雪

    bzoj description 你要给一个树上的每个点黑白染色,要求白点不相邻.求本质不同的染色方案数. 两种染色方案本质相同当且仅当对树重新标号后对应节点的颜色相同. \(n\le 5\times ...