zoukankan      html  css  js  c++  java
  • 教程-delphi的开源json库:superobject,用法简介

    困惑一天的问题 一个语句搞定了。。。 回头细说。

    superobject中的{$DEFINE UNICODE}

     就是它,这是json官方推荐的Delphi处理json的包,地址: http://www.progdigy.com/?page_id=6  

     superobject中自动默认为UNICODE编码,处理中文会出现乱码。

    注释{$DEFINE UNICODE} 就可以了。


    var
        j, a: ISuperObject; //不能是TSuperObject,尽管有TSuperObject这个类,但这里就是要这样无厘头。

    begin
    j:=TSuperObject.Create(stObject); //创建一个json对象,如果参数是stArray,j就是一个json数组,参数还可以是其它的变量类型,比如字符串,数值之类的,看起来很强大,但是如果参数是一个描述了json的字符串的话,你会得到一个错误。如果想从文本加载,用j:=SO(json文本);

    j.I['数字']:=123;  //就等于 {"数字": 123} ,类似的,I还可以变成S,B,C之类的,以表示字符串,布尔型,货币型。
    j.S['{字符串}']:="值"; //这是个bug:带有花括号时没有任何效果。

    a:=TSuperObject.Create(stArray); //创建一个json数组a
    a.I['']:=111;  //表示给a数组添加一个111元素。注意[]中的值为'',在数组中其[]的语义进行了颠覆性的改变。
    a.I[2]:="s"; //第3个元素值为"s",嗯,[]在superobject的用法还真多
    j['arr']:=a; //把数组a添加进j,其key名为arr

    showmessage( j.toJson() );  //查看j的json文本

    j:=nil;  //不能写j.Free

    end;

     先来看看什么是Json

      JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, Delphi,JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

      在http://www.json.org/json-zh.html中,已经提供了针对各种语言的json支持。

      从它名字中就可以看出,json最早是来源于javascript,在javascript中操作json数据异常简单清晰。可以像操作类对象一样运用json数据,如

      //example1:

      jdata =http://blog.soso.com/qz.q/{"name":"老王","age":"25"};

      str1 = jdata.name;//老王

      str2 = jdata["name"];//老王

      //example2:

      jdata =http://blog.soso.com/qz.q/{"name":"老王","age":"25","address":{"address1":"福州","address2":"厦门"}};

      str1 = jdata.address.address1;//福州

      str2 = jdata["address"]["address1"];//福州

      在Delphi2009之后的版本已经加入了对json的支持,不再需要第三方类库的支持。但我跟喜欢用Henri Gourvest的开发的SuperObject,有兴趣的可以到http://www.progdigy.com/?page_id=6了解,最新版是1.24.

      SuperObject提供了两个类库文件SuperObject.pas,superxmlparser.pas,其中SuperObject.pas就是用于操作json数据,而superxmlparser.pas用与从XML数据中解析出json数据。

      简单例子

      uses SuperObject;

      procedure TForm1.Button1Click(Sender: TObject);

      var

      soTest:ISuperObject;

      begin

      soTest := so('{"name":"张三","age":"25","address":{"Address1":"福州","address2":"厦门"}}');

      //等价的方法 soTest := TSuperObject.ParseString('{"name":"张三","age":"25","address":{"Address1":"福州","address2":"厦门"}}');

      ShowMessage(soTest['name'].AsString);//张三

      ShowMessage(soTest['address.Address1'].AsString);/ /福州

      end;

      SuperObject类库提供了类似javascript操作json的数据的方式,相当方便。


    ==========================================================================================
    下面是一个生成数组的例子:
    procedure TForm3.Button1Click(Sender: TObject);
    var
      Json,ArrJson,Arr: ISuperObject;
      I:integer;
    begin
      ArrJson:=SA([]);
      Arr:=SO();
      for I:=0 to 4 do
      begin
        Json := SO;
        Json.S['tittle'] :='bt'+inttostr(I);
        Json.I['classification'] := i;
        Json.I['offercent'] := i;
        Json.s['hints'] := 'djs'+inttostr(i);
        Json.S['content'] := 'nr'+inttostr(i);
        Json.S['date'] := 'twtime'+inttostr(i);
        Json.S['url'] := 'wt_filename'+inttostr(i);
        ArrJson.AsArray.Add(Json);
      end;
      Arr.o['A']:=ArrJson;
      Memo1.Text:=(Arr.AsString);
    end;
    end.
    解析的话 反过来就行了! 

    ======================================================================= 
    procedure TForm1.Button5Click(Sender: TObject);
    var
        j, a: ISuperObject; //不能是TSuperObject,尽管有TSuperObject这个类,但这里就是要这样无厘头。
    begin
    j:=TSuperObject.Create(stObject); //创建一个json对
    j.I['数字']:=123;  //就等于 {"数字": 123} ,。
    j.S['字符串']:='值'; //这是个bug:带有花括号时没有任何效果。
    a:=TSuperObject.Create(stArray); //创建一个json数组a
    a.I['']:=111;  //表示给a数组添加一个111元素。注意[]中的值为'',在数组中其[]的语义进行了颠覆性的改变。
    a.I['2']:=12; //第3个元素值为"s",嗯,[]在superobject的用法还真多
    j['arr']:=a; //把数组a添加进j,其key名为arr
    showmessage( j.AsString() );  //查看j的json文本
    j:=nil;  //不能写j.Free
    end; 
  • 相关阅读:
    HDU2586 How far away?(tarjan的LCA)
    You Raise Me Up
    POJ2891 Strange Way to Express Integers(中国剩余定理)
    POJ2142 The Balance(扩展欧几里得)
    HDU 1166模仿大牛写的线段树
    NetWord Dinic
    HDU 1754 线段树裸题
    hdu1394 Minimum Inversion Number
    hdu2795 Billboard
    【完全版】线段树
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/4654393.html
Copyright © 2011-2022 走看看