`
pascal4123
  • 浏览: 114647 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SuperObject Readme

    博客分类:
  • GP
阅读更多

 

What is JSON ?

JSON (JavaScript Object Notation) is a lightweight data-interchange format.
It is easy for humans to read and write. 
It is easy for machines to parse and generate. 
It is based on a subset of the JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999. 
JSON is a text format that is completely language independent but uses conventions that are familiar to programmers.
These properties make JSON an ideal data-interchange language.
You can get more informations on json.org.

{
  "name": "Henri Gourvest", /* this is a comment */
  "vip": true,
  "telephones": ["000000000", "111111111111"],
  "age": 33,
  "size": 1.83,
  "adresses": [
    {
      "adress": "blabla",
      "city": "Metz",
      "pc": 57000
    },
    {
      "adress": "blabla",
      "city": "Nantes",
      "pc": 44000
    }
  ]
}


Parsing a JSON data structure

var
  obj: ISuperObject;
begin
  obj := SO('{"foo": true}');
  obj := TSuperObject.ParseString('{"foo": true}');
  obj := TSuperObject.ParseStream(stream);
  obj := TSuperObject.ParseFile(FileName);
end;


Accessing data

There isn't individual datastructure for each supported data types.
They are all an object: the ISuperObject.

  val := obj.AsString;
  val := obj.AsInteger;
  val := obj.AsBoolean;
  val := obj.AsDouble;
  val := obj.AsArray;
  val := obj.AsObject;
  val := obj.AsMethod;


How to read a property value of an object ?

  val := obj.AsObject.S['foo']; // get a string
  val := obj.AsObject.I['foo']; // get an Int64
  val := obj.AsObject.B['foo']; // get a Boolean
  val := obj.AsObject.D['foo']; // get a Double
  val := obj.AsObject.O['foo']; // get an Object (default)
  val := obj.AsObject.M['foo']; // get a Method
  val := obj.AsObject.N['foo']; // get a null object


How to read a value from an array ?

  // the advanced way
  val := obj.AsArray.S[0]; // get a string
  val := obj.AsArray.I[0]; // get an Int64
  val := obj.AsArray.B[0]; // get a Boolean
  val := obj.AsArray.D[0]; // get a Double
  val := obj.AsArray.O[0]; // get an Object (default)
  val := obj.AsArray.M[0]; // get a Method
  val := obj.AsArray.N[0]; // get a null object


Using paths

Using paths is a very productive method to find an object when you know where is it.
This is some usage cases:

  obj['foo']; // get a property
  obj['123']; // get an item array
  obj['foo.list']; // get a property from an object
  obj['foo[123]']; // get an item array from an object
  obj['foo(1,2,3)']; // call a method
  obj['foo[]'] := value; // add an item array

you also can encapsulate paths:

  obj := so('{"index": 1, "items": ["item 1", "item 2", "item 3"]}');
  obj['items[index]'] // return "item 2"

or recreate a new data structure from another:

  obj := so('{"index": 1, "items": ["item 1", "item 2", "item 3"]}');
  obj['{"item": items[index], "index": index}'] // return {"item": "item 2", "index": 1}


Browsing data structure

Using Delphi enumerator.

Using Delphi enumerator you can browse item's array or property's object value in the same maner.

var
  item: ISuperObject;
begin
  for item in obj['items'] do ...

you can also browse the keys and values of an object like this:

var
  item: TSuperAvlEntry;
begin
  for item in obj.AsObject do ...
  begin
    item.Name;
    item.Value;
  end;


Browsing object properties without enumerator

var
  item: TSuperObjectIter;
begin
  if ObjectFindFirst(obj, item) then
  repeat
    item.key;
    item.val;
  until not ObjectFindNext(item);
  ObjectFindClose(item);


Browsing array items without enumerator

var
  item: Integer;
begin
  for item := 0 to obj.AsArray.Length - 1 do
    obj.AsArray[item]


RTTI & marshalling in Delphi 2010

type
  TData = record
    str: string;
    int: Integer;
    bool: Boolean;
    flt: Double;
  end;
var
  ctx: TSuperRttiContext;
  data: TData;
  obj: ISuperObject;
begin
  ctx := TSuperRttiContext.Create;
  try
    data := ctx.AsType<TData>(SO('{str: "foo", int: 123, bool: true, flt: 1.23}'));
    obj := ctx.AsJson<TData>(data);
  finally
    ctx.Free;
  end;
end;


Saving data

  obj.AsJSon(options);
  obj.SaveTo(stream);
  obj.SaveTo(filename);


Helpers

  SO(['prop1', true, 'prop2', 123]); // return an object {"prop1": true, "prop2": 123}
  SA([true, 123]); // return an array [true, 123]


Non canonical forms

The SuperObject is able to parse non canonical forms.
// unquoted identifiers
SO('{foo: true}');
// unescaped or unquoted strings
SO('{собственность: bla bla bla}');
// excadecimal
SO('{foo: \xFF}');
分享到:
评论

相关推荐

    superobject_master

    在处理JSON数据时,库和框架的使用至关重要,"superobject"就是这样一个专门用于解析JSON的库。 标题中的"superobject_master"可能是指一个开源项目或库的主分支,通常在Git等版本控制系统中,"master"分支代表了...

    JSON - xe2 superobjectv1.2.4.zip

    JSON(JavaScript Object ...通过阅读readme.html,理解并使用superobject.pas和superxmlparser.pas中的函数和类,以及参考demos和tests中的示例,开发者能够熟练地集成和使用SuperObject来实现JSON相关的功能。

    superobjectv1.2.5

    除了核心库,`readme.html`文件通常包含了关于如何安装、配置和使用SuperObject的详细说明。`demos`和`tests`目录则分别提供了示例代码和单元测试,这些资源可以帮助开发者快速上手并确保正确地利用库的功能。 总的...

    Bayesian-Object-Detection.zip_detection object _object detection

    10. `bodids.m`:可能是指基于贝叶斯的物体检测身份识别(Object Detection with Identity Supervision),可能用于跟踪和区分不同物体。 综上所述,这个项目使用贝叶斯方法来解决动态场景中的物体检测问题,通过一...

    Delphi-JsonToDelphiClass-0.64.zip

    Delphi中处理JSON数据的关键在于JSON解析库,比如Indy的TIdJSON或SuperObject。这个工具可能提供了一种自动化的方式,将JSON结构映射到Delphi的面向对象模型中,从而简化了从JSON数据创建和填充Delphi对象的过程。在...

    非常好用的Delphi的XML解析类

    基于提供的标签“Delphi XML”,我们可以推测这个解析类可能使用了Delphi内置的XMLDOM或TXMLDocument组件,或者是第三方库如SuperObject、FastXML等。这些组件或库允许开发者通过对象模型来操作XML文档,例如获取、...

    superv1sor.github.io

    1. **基础语法**:变量声明(var, let, const)、数据类型(number, string, boolean, object等)、控制流程(if, for, while)、函数定义与调用。 2. **DOM操作**:使用`document.getElementById`, `querySelector...

    super-awesome-reddit-machine:超级棒的Reddit机器

    至于文件`super-awesome-reddit-machine-master`,这看起来是一个GitHub仓库的克隆,通常包含项目的源代码、配置文件、README文档和其他资源。要深入了解这个项目的工作原理,你需要解压文件并查看源代码,包括`...

    objc代码-测试测试测试

    XCTAssertTrue([myObject performSomeFunction], @"函数应该返回正确的结果"); } @end ``` 在`README.txt`中,可能会有如下的指导: ``` # 测试指南 1. 打开Xcode项目。 2. 确保已选中你要测试的目标。 3. 在...

    结合telnet与ftp 功能服务器wasd第三版源码

    # Super Ftp Server and Client for Wall-e # # Sun May 30 2009 # # author: supertiger # # version: 3.0 # ############################################...

    Java基于SSH的超市管理系统设计源码案例设计.zip

    2. `DAO`(Data Access Object):用于数据库操作,实现对商品、客户等实体的CRUD(创建、读取、更新、删除)操作。 3. `Model`:业务对象,如商品、订单等实体类。 4. `Service`:业务逻辑层,处理业务规则和事务...

    flex自定义datagrid

    override public function set data(value:Object):void { super.data = value; checkBox.selected = value.isSelected; //假设数据对象有一个isSelected属性 } // 添加事件监听器以处理复选框状态的改变 ...

    (转)通用JAVA RMI服务器框架

    RMI系统包含三大部分:远程接口(Remote Interface)、远程对象(Remote Object)和 stub 和 skeleton。远程接口定义了可供远程调用的方法,远程对象实现了这些接口,stub是远程对象的代理,用于在网络中传输,而...

    java代码-Rectangle

    - `equals(Object obj)`: 检查此矩形是否等于另一个对象。 - `toString()`: 返回矩形的字符串表示形式。 ### 3. `Rectangle`在GUI中的应用 在Java的AWT和Swing库中,`Rectangle`常用于描述组件的位置和大小。例如,...

    eacwmp相关源码包

    这种格式广泛用于Linux和Unix系统,包含了源码文件、文档、配置脚本等所有内容,解压后用户可以按照README或INSTALL文件的指示进行编译和安装。 2. `git.tar` 可能是一个包含Git仓库的压缩文件,可能是easycwmp项目...

    js代码-实现原生类继承

    var proto = Object.create(Parent.prototype); proto.constructor = Child; Child.prototype = proto; Child.prototype.sayAge = function() { console.log(this.age); }; ``` 4. ES6的类继承 ES6引入了...

    js代码-Javascript继承问题

    super(name); // 调用父类构造函数 this.age = age; } } let child = new Child('child', 5); child.sayName(); // 输出 'child' ``` ### 6. `main.js`文件可能的应用 `main.js`文件很可能包含了关于...

    js代码-继承内置类型

    这个压缩包中的`main.js`很可能包含了上述概念的一些实际示例代码,而`README.txt`可能包含了对这些代码的解释或使用指南。为了深入理解,建议查看这两个文件,并尝试运行和修改代码以实践这些概念。

    js代码-Babel的继承

    `README.txt`文件可能提供了关于如何运行或理解这些代码的说明,包括如何配置和使用Babel,或者可能包含了一些关于Babel转换过程的额外信息。 总的来说,Babel是JavaScript开发中的重要工具,它使得开发者可以充分...

    js代码-继承函数的封装demo

    在JavaScript中,继承是面向对象编程的一个核心概念,它允许一个对象(子对象...`README.txt`文件可能提供了关于如何运行和测试这些代码的说明。掌握这种继承封装技术,将有助于编写更加灵活和可维护的JavaScript代码。

Global site tag (gtag.js) - Google Analytics