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);
 
从json反序列化为数组
  oup_List:=  TJsonSerializer.Create.Deserialize<TArray<TODPatient>>( jo.GetValue<TJSONArray>('response.message.items').ToString);

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', 40));
fMyPeople.Add(TPerson.Create('Morticia', 'Addams', 38));
fMyPeople.Add(TPerson.Create('Pugsley', 'Addams', 8));
fMyPeople.Add(TPerson.Create('Wednesday', 'Addams', 12));



// 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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    
////
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.
1
2
3
4
5
6
    
////
#include <System.JSON.Converters.hpp>
#include <System.JSON.Serializers.hpp>
#include <System.Generics.Collections.hpp>
#include <System.JSON.Writers.hpp>
#include <memory>
View Code
 
////
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;
    }
 
 
}
View Code

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 := 1;
  user.FFirstName := 'delphi';
  user.FLastName := 'berlin';

  SetLength(userList, 2);

  userList[0] := user;

  user := TUser.Create;
  user.FFirstName := 'delphi';
  user.FAge := 2;
  user.FLastName := 'tokyo';

  userList[1] := (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;

 

posted on 2016-03-25 14:12  lypzxy  阅读(5307)  评论(0编辑  收藏  举报