zoukankan      html  css  js  c++  java
  • delphi 实体类 JSON 数组 TJsonSerializer Deserialize

    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);
     

    TJsonReaderTJsonTextWriter

    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;
  • 相关阅读:
    单例模式的七种写法
    Android省电开发 浅析
    android省电开发之cpu降频
    什么是签名、为什么要给应用程序签名、如何给应用程序签名
    内存溢出和内存泄漏的区别、产生原因以及解决方案
    Android Studio 使用GitHub
    sharesdk 的使用
    当ViewPager嵌套在ScrollView/ListView里时,手势冲突如何处理?
    laravel安装笔记
    erlang的一些小技巧(不定期更新)
  • 原文地址:https://www.cnblogs.com/cb168/p/5319295.html
Copyright © 2011-2022 走看看