winston 发表于 2012-2-13 14:39:19

What is JSON

SuperObject
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 structurevar
obj: ISuperObject;
begin
obj := SO('{"foo": true}');
obj := TSuperObject.ParseString('{"foo": true}');
obj := TSuperObject.ParseStream(stream);
obj := TSuperObject.ParseFile(FileName);
end;
Accessing dataThere isn't individual datastructure for each supported data types.
They are all an object: the ISuperObject. val := obj.AsObject.S['foo']; // get a
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 ?// the advanced way
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 ?val := obj.AsArray.S; // get a string
val := obj.AsArray.I; // get an Int64
val := obj.AsArray.B; // get a Boolean
val := obj.AsArray.D; // get a Double
val := obj.AsArray.O; // get an Object (default)
val := obj.AsArray.M; // get a Method
val := obj.AsArray.N; // get a null object
Using paths
obj['foo']; // get a property

Using paths is a very productive method to find an object when you know where is it.
This is some usage cases:
obj := so('{"index": 1, "items": ["item 1", "item 2", "item 3"]}');

obj['123']; // get an item array
obj['foo.list']; // get a property from an object
obj['foo']; // 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'] // return "item 2"
or recreate a new data structure from another:
obj['{"item": items, "index": index}'] // return {"item": "item 2", "index": 1}
Browsing data structureUsing Delphi enumerator.
var

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 enumeratorvar
item: TSuperObjectIter;
begin
if ObjectFindFirst(obj, item) then
repeat
    item.key;
    item.val;
until not ObjectFindNext(item);
ObjectFindClose(item);
Browsing array items without enumeratortype
item: Integer;
begin
for item := 0 to obj.AsArray.Length - 1 do
    obj.AsArray
RTTI & marshalling in Delphi 2010obj.AsJSon(options);
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 dataSO(['prop1', true, 'prop2', 123
obj.SaveTo(stream);
obj.SaveTo(filename);
Helpers]); // return an object {"prop1": true, "prop2": 123}
SA(); // return an array
Non canonical formsThe 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}');
页: [1]
查看完整版本: What is JSON