预习Delphi 2009 中的新功能- JSON (一) : 什么是JSON?
JSON(JavaScript Object Notation) 类似与XML;
虽始于JavaScript, 但被多种语言支持, 它也成了Delphi 2009 的新功能之一.
假如有一段XML:
2 张三99
用json 可以表示为:
{"id":2, "name":"张三", "age":99}
json 在JavaScript 中使用异常方便, 譬如:
//例1:
Data = {"id":2, "name":"张三", "age":99};
str = Data.id; //2
str = https://www.doczj.com/doc/5710385731.html,; //张三
str = Data["name"]; //张三
//例2:
Data = {"id":2, "name":{"FirstName":"张", "LastName":"三"}, "age":99};
str = https://www.doczj.com/doc/5710385731.html,.FirstName; //张
str = Data["name"]["FirstName"]; //张
//例3:
Data =
[
{"name":"张三", "age":9},
{"name":"李四", "age":19},
{"name":"王五", "age":29}
]
str = Data[2].name; //王五
str = Data[2]["name"]; //王五
//例4:
Data = {"name":"张三", "age":19, "like":["游戏","足球"]};
str = Data.like[1]; //足球
str = Data["like"][1]; //足球
本例中的JavaScript 代码也可以在Delphi 中调试, 参见:
https://www.doczj.com/doc/5710385731.html,/del/archive/2008/08/06/1261580.html
json 中:
元素与值用冒号":" 隔开
元素与元素用逗号"," 隔开
{} 之间是一个对象, 对象可以层层嵌套
[] 表示数组, 数组元素用逗号"," 隔开
值可以是string、number、object、array、tr、false、null; 其中string 要使用双引号(也有语言可以用单引号)
string 中可以使用类似C 语言的转义字符
number 可以使用科学计数法
JSON 之SuperObject(1)
一直盼着Delphi 能够直接支持"正则表达式" 与"JSON";
Delphi 2009 刚来的时候, 有了JSON, 但不好, 那时尝试过一点. 这是以前的链接: 什么是JSON?
Delphi 2010 带了两个相关单元: DBXJSON、DBXJSONReflect 貌似很强大, 但主要是给DataSnap 准备的; 尝试了半天, 也很失望: 可能给DataSnap 网络数据传递够用了, 但太简陋了, 好像是没写完, 对中文支持也有问题.
我想不等了, 找第三方吧, 真的找到了惊喜: JSON –SuperObject v1.1(简介、下载), Henri Gourvest 的大作!
里面还有XML 相关的一个单元, 慢慢看吧.
先来个简单测试:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses SuperObject;
//SuperObject 提倡使用接口; ParseString 是TSuperObject 类的Class 方法
procedure TForm1.Button1Click(Sender: TObject);
var
jo: ISuperObject;
begin
jo := TSuperObject.ParseString('{"No1":"张三", "No2":"李四"}');
ShowMessage(jo['No1'].AsString); {张三}
end;
//有个共用函数SO, 可方便实现接口
procedure TForm1.Button2Click(Sender: TObject);
var
jo: ISuperObject;
begin
jo := SO('{"No1":"张三", "No2":"李四"}');
ShowMessage(jo['No2'].AsString); //李四
end;
end.
为什么以用接口为主?
我猜是: 一个JSON 对象中可能包含的子对象太多, 用接口释放比较方便, 因为是自动释放;
另外, Delphi 2010 新给的IOUntils 单元的功能是用结构的方式给出, 结构也是自释放的; 自动释放! 这会是个方向吗? 不过这样的确会少写很多代码.
JSON 之SuperObject(2): 构建方式与AsJSon
SuperObject 构建一个JSON 的常用方法: 从字符串、从文件、从流.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses SuperObject;
const JsonStr = '{"No1":"张三", "No2":"李四"}';
//从字符串构建
procedure TForm1.Button1Click(Sender: TObject);
var
jo: ISuperObject;
begin
jo := SO(JsonStr);
{或者用使用下面语句, SO 函数就是调用了TSuperObject.ParseString}
//jo := TSuperObject.ParseString(JsonStr);
ShowMessage(jo.AsJSon(Tr, False));
end;
//从文件构建
procedure TForm1.Button2Click(Sender: TObject);
const
path = 'c:\temp\json.txt';
var
jo: ISuperObject;
begin
{产生个测试文件; SuperObject 对中文支持也不太好, 读取它自己保存的文件吧} SO(JsonStr).SaveTo(path); {这就产生并保存了json 文件}
jo := TSuperObject.ParseFile(path);
ShowMessage(jo.AsJSon(Tr, False));
end;
//从流构建
procedure TForm1.Button3Click(Sender: TObject);
var
jo: ISuperObject;
stm: TStream;
b: Byte;
begin
{模拟个测试流; 看看它能接受的编码够原始的, 它存取文件也是如此}
stm := TStringStream.Create('{"No2":"\李\四","No1":"\张\三"}');
jo := TSuperObject.ParseStream(stm);
ShowMessage(jo.AsJSon(Tr, False));
stm.Free;
end;
//AsJSon 的参数
procedure TForm1.Button4Click(Sender: TObject);
var
jo: ISuperObject;
begin
jo := SO(JsonStr);
ShowMessage(jo.AsJSon);
ShowMessage(jo.AsJSon(Tr));
ShowMessage(jo.AsJSon(Tr, False));
ShowMessage(jo.AsJSon(False, False));
end;
end.
JSON 之SuperObject(3): 访问
测试数据提前加入Memo1 中:
{ "name": "张三", /* 注释*/ "age": 33, "sex": tr, "weight": 123.456, "tel": ["86-1111111", "86-2222222"], "addresses":{"address":"A省B市", "pc":"100001"}, "children": [ { "name": "张继", "age": "22", "sex": tr }, { "name": "张承", "age": "11", "sex": false } ] }
代码文件:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Button8: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject); end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses SuperObject;
//数组式访问
procedure TForm1.Button1Click(Sender: TObject); var
jo: ISuperObject;
begin
jo := SO(Memo1.Text);
ShowMessage(jo['name'].AsString); ShowMessage(jo['age'].AsString); ShowMessage(jo['sex'].AsString); ShowMessage(jo['weight'].AsString); ShowMessage(jo['addresses'].AsString); ShowMessage(jo['tel'].AsString); ShowMessage(jo['children'].AsString);
end;
//指定返回类型
procedure TForm1.Button2Click(Sender: TObject); var
jo: ISuperObject;
s: string;
i: Integer;
d: Dole;
b: Boolean;
begin
jo := SO(Memo1.Text);
s := jo['name'].AsString;
i := jo['age'].AsInteger;
b := jo['sex'].AsBoolean;
d := jo['weight'].AsDole;
ShowMessage(s);
ShowMessage(IntToStr(i));
ShowMessage(BoolToStr(b, Tr));
ShowMessage(FloatToStr(d));
s := jo.S['name'];
i := jo.I['age'];
b := jo.B['sex'];
d := jo.D['weight'];
ShowMessage(s);
ShowMessage(IntToStr(i));
ShowMessage(BoolToStr(b, Tr));
ShowMessage(FloatToStr(d));
{
jo['name'] 是jo.O['name'] 的简化形式, 因为它是类的默认数组; jo.N 类似jo.O, 区别是jo.N 在参数不妥时可返回空;
jo.M 和方法有关, 对象中可嵌入方法.
}
end;
//内嵌对象访问
procedure TForm1.Button3Click(Sender: TObject);
var
jo: ISuperObject;
begin
jo := SO(Memo1.Text);
ShowMessage(jo['addresses.address'].AsString);
ShowMessage(jo['addresses.pc'].AsString);
end;
//TSuperArray
procedure TForm1.Button4Click(Sender: TObject);
var
jo: ISuperObject;
ja: TSuperArray;
begin
jo := SO(Memo1.Text);
ja := jo['tel'].AsArray;
ShowMessage(IntToStr(ja.Length));
ShowMessage(ja[0].AsString);
ShowMessage(ja[1].AsString);
ja := jo['children'].AsArray;
ShowMessage(ja[0]['name'].AsString);
ShowMessage(ja[1]['name'].AsString);
end;
//遍历对象
procedure TForm1.Button5Click(Sender: TObject);
var
item,jo: ISuperObject;
begin
jo := SO(Memo1.Text);
for item in jo do ShowMessage(item.AsJSon(False, False)); end;
//遍历子对象
procedure TForm1.Button6Click(Sender: TObject);
var
item,jo: ISuperObject;
begin
jo := SO(Memo1.Text);
for item in jo['children'] do
ShowMessage(item.AsJSon(False, False));
end;
//使用TSuperAvlEntry 或TSuperTableString 遍历procedure TForm1.Button7Click(Sender: TObject);
var
jo: ISuperObject;
item: TSuperAvlEntry;
begin
jo := SO(Memo1.Text);
for item in jo.AsObject do
ShowMessageFmt('Name: %s; Val: %s', [https://www.doczj.com/doc/5710385731.html,, item.Val.AsString]); end;
//使用TSuperObjectIter 遍历
procedure TForm1.Button8Click(Sender: TObject);
var
jo: ISuperObject;
item: TSuperObjectIter;
begin
jo := SO(Memo1.Text);
if ObjectFindFirst(jo, item) then
repeat
ShowMessageFmt('key: %s; val: %s', [item.key, item.val.AsString]); until not ObjectFindNext(item);
ObjectFindClose(item);
end;
end.
窗体文件:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 296
ClientWidth = 377
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
https://www.doczj.com/doc/5710385731.html, = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Memo1: TMemo
Left = 0
Top = 0
Width = 281
Height = 296
Align = alLeft
Lines.Strings = (
'{'
' "name": "'#24352#19977'", /* '#27880#37322' */'
' "age": 33,'
' "sex": tr,'
' "weight": 123.456,'
' "tel": ["86-1111111", "86-2222222"],'
' "addresses":{"address":"A'#30465'B'#24066'", "pc":"100001"},' ' "children": ['
' {'
' "name": "'#24352#32487'",'
' "age": "22",'
' "sex": tr'
' },'
' {'
' "name": "'#24352#25215'",'
' "age": "11",'
' "sex": false'
' }'
' ]'
'}')
ScrollBars = ssBoth
TabOrder = 0
ExplicitHeight = 292
end
object Button1: TButton
Left = 287
Top = 24
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 1
OnClick = Button1Click
end
object Button2: TButton
Left = 287
Top = 55
Width = 75
Caption = 'Button2' TabOrder = 2
OnClick = Button2Click end
object Button3: TButton Left = 287
Top = 86
Width = 75
Height = 25
Caption = 'Button3' TabOrder = 3
OnClick = Button3Click end
object Button4: TButton Left = 287
Top = 117
Width = 75
Height = 25
Caption = 'Button4' TabOrder = 4
OnClick = Button4Click end
object Button5: TButton Left = 287
Top = 148
Width = 75
Height = 25
Caption = 'Button5' TabOrder = 5
OnClick = Button5Click end
object Button6: TButton Left = 287
Top = 179
Width = 75
Height = 25
Caption = 'Button6' TabOrder = 6
OnClick = Button6Click end
object Button7: TButton
Top = 213
Width = 75
Height = 25
Caption = 'Button7'
TabOrder = 7
OnClick = Button7Click
end
object Button8: TButton
Left = 287
Top = 244
Width = 75
Height = 25
Caption = 'Button8'
TabOrder = 8
OnClick = Button8Click
end
end
JSON 之SuperObject(4): 增、删、改
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses SuperObject;
//添加
procedure TForm1.Button1Click(Sender: TObject);
var
jo: ISuperObject;
i: Integer;
begin
jo := TSuperObject.Create;
for i := 0 to 9 do jo.I['N' + IntToStr(i)] := i; ShowMessage(jo.AsJSon(Tr));
for i := 0 to 9 do jo.S['N' + IntToStr(i)] := IntToStr(i); ShowMessage(jo.AsJSon(Tr));
for i := 0 to 9 do jo.B['N' + IntToStr(i)] := Odd(i); ShowMessage(jo.AsJSon(Tr));
for i := 0 to 9 do jo.D['N' + IntToStr(i)] := i / 2; ShowMessage(jo.AsJSon(Tr));
for i := 0 to 9 do jo.O['N' + IntToStr(i)] := SO('{"A":"B"}'); ShowMessage(jo.AsJSon(Tr));
jo.Clear;
ShowMessage(jo.AsJSon(Tr));
end;
//修改与删除
procedure TForm1.Button2Click(Sender: TObject);
var
jo: ISuperObject;
str: string;
begin
jo := SO('{"Name":"张三", "Age":88}');
ShowMessage(jo.AsJSon(False, False));
jo.S['Name'] := '李四';
jo.I['Age'] := 18;
ShowMessage(jo.AsJSon(False, False));
jo.Delete('Age');
ShowMessage(jo.AsJSon(False, False));
jo.D['Size'] := 1.83;
ShowMessage(jo.AsJSon(False, False));
end;
//TSuperArray 的增、删、改与查看
procedure TForm1.Button3Click(Sender: TObject); var
jo,item: ISuperObject;
ja: TSuperArray;
i: Integer;
str: string;
begin
jo := SO('{"爱好":["编程","打球"]}'); ShowMessage(jo.AsJSon(False, False));
jo.A['爱好'].Add(SO('看电视')); ShowMessage(jo.AsJSon(False, False));
ja := jo.A['爱好'];
ja.Add(SO('游泳'));
ShowMessage(jo.AsJSon(False, False));
ja.Insert(0, SO('睡觉'));
ShowMessage(jo.AsJSon(False, False));
ja.Delete(0);
ShowMessage(jo.AsJSon(False, False));
ja.D[0] := 3.14;
ShowMessage(jo.AsJSon(False, False));
ja.O[0] := SO('{}');
ShowMessage(jo.AsJSon(False, False));
str := '';
for i := 0 to ja.Length - 1 do str := Format('%s %s', [str, ja.S[i]]); ShowMessage(Trim(str));
str := '';
for item in jo['爱好'] do str := Format('%s %s', [str, item.AsString]); ShowMessage(Trim(str));
ja.Clear;
ShowMessage(jo.AsJSon(False, False));
end;
end.
JSON 之SuperObject(5): Format 与转义字符
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses SuperObject;
//Format
procedure TForm1.Button1Click(Sender: TObject);
var
jo: ISuperObject;
begin
jo := SO('{"Name":"张三", "Age":88, "Tel":["111,222"], "Children":{"Name":"张继"}}'); ShowMessage(jo.Format('姓名: %Name%; 年龄: %Age%'));
ShowMessage(jo.Format('%Tel%; %Tel[0]%; %Tel[1]%'));
ShowMessage(jo.Format('%Children%; %https://www.doczj.com/doc/5710385731.html,%'));
ShowMessage(jo.Format('[Name], [Age]', '[', ']')); {可更换默认的% 标记}
end;
//特殊字符
procedure TForm1.Button2Click(Sender: TObject);
var
jo: ISuperObject;
begin
jo := SO;
{ \u }
jo := SO('"\A\B\C"');
ShowMessage(jo.AsString);
{ \x }
jo := SO('"\x41\x42\x43"');
ShowMessage(jo.AsString);
{ \u 汉字}
jo := SO('"\万\一"');
ShowMessage(jo.AsString);
{ \u 后面的数字可大写}
jo := SO('"\万\一"');
ShowMessage(jo.AsString);
{ \\、\/ }
jo := SO('"A\\B\/C"');
ShowMessage(jo.AsString);
{ \t、\n 还有\b、\f、\r }
jo := SO('"A\tB\nC"');
ShowMessage(jo.AsString);
{ \"" }
jo := SO('"\"ABC\""');
ShowMessage(jo.AsString);
{ null 是JSON 的一种数据类型, 代表空值, 空值也是值的一种}
jo := SO('[1,2,3,null]');
ShowMessage(jo.AsString);
end;
end.
JSON 之SuperObject(6): 方法
SuperObject 的JSON 对象中还可以包含"方法", 这太有意思了; 其方法的格式是: procedure Method(const This, Params: ISuperObject; var Result: ISuperObject);
//另外, 这是其数据类型的枚举:
TSuperType = (stNull, stBoolean, stDole, stInt, stObject, stArray, stString, stMethod);
测试代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Keyboard;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses SuperObject;
//方法1; 参数列表是规定好的, 但这里没使用参数
procedure Method1(const This, Params: ISuperObject; var Result: ISuperObject);
begin
ShowMessage('Hello');
end;
//方法2; 这里使用了第二个参数; 这里的第二个就是调用时的第一个
procedure Method2(const This, Params: ISuperObject; var Result: ISuperObject);
begin
ShowMessage(Params.AsJSon);
end;
//方法3; 这里使用了第一个参数; 第一个参数值使用时无需传递, 它代表使用方法的对象本身
procedure Method3(const This, Params: ISuperObject; var Result: ISuperObject);
begin
ShowMessage(This.AsJSon);
end;
//方法4; 这里使用了第三个参数; 这是调用时的返回值, 如果不给它赋值, 调用时将无返回值
procedure Method4(const This, Params: ISuperObject; var Result: ISuperObject);
begin
Result := This;
Result.Merge(Params, Tr); {合并}
end;
//第一种使用方法
procedure TForm1.Button1Click(Sender: TObject);
var
jo: ISuperObject;
begin
jo := SO('{"X":"Y"}');
jo.M['jm1'] := @Method1;
jo.M['jm2'] := @Method2;
jo.M['jm3'] := @Method3;
jo.M['jm4'] := @Method4;
jo.call('jm1'); // Hello
jo.call('jm2', SO('{"A":"B"}')); // {"A":"B"}
jo.call('jm2', '{"A":"B"}'); // {"A":"B"}
jo.call('jm3'); // {"X":"Y"}
jo.call('jm4', '{"B":null}');
ShowMessage(jo.AsJSon); // {"X":"Y","B":null} end;
//第二种使用方法
procedure TForm1.Button2Click(Sender: TObject);
var
t,jo: ISuperObject;
begin
jo := SO('{"X":"Y"}');
jo.M['jm1'] := @Method1;
jo.M['jm2'] := @Method2;
jo.M['jm3'] := @Method3;
jo.M['jm4'] := @Method4;
jo['jm1()']; // Hello
jo['jm2(' + '{"A":"B"}' + ')']; // {"A":"B"}
jo['jm2({A:B})']; // {"A":"B"}
jo['jm3()']; // {"X":"Y"}
后台转换JSON数据类型,前台解析JSON数据等等例子总结 JSON对象: JSONObject obj = new JSONObject(); obj.put("result", 0); obj.put("message", message); return obj.toJSONString(); 前台解析: Success:function(data){ var result = data.result; var message = data.message; } json对象中有json对象的写法: Objstr为一个JSONObject obj的String转换 private String getsuccess(String objstr,int number){ JSONObject obj = new JSONObject(); obj.put("result", 1); obj.put("obj", objstr); obj.put("number", number); return obj.toJSONString(); }
前台解析: Picjson为success返回的data var result = picjson.result; if (result==1) { var objdata = picjson.obj; var data = eval('(' + objdata + ')'); var num = picjson.number; picurl = null; showpiclist(data, num); } else{ alert(picjson.message); picurl = null; } list转成json对象 需要的包: https://www.doczj.com/doc/5710385731.html,mons-lang.jar https://www.doczj.com/doc/5710385731.html,mons-beanutils.jar https://www.doczj.com/doc/5710385731.html,mons-collections.jar https://www.doczj.com/doc/5710385731.html,mons-logging.jar
jQuery 1. 什么是jQuery?? jQuery是一个优秀的JavaScript框架,一个轻量级的JavaScript类库。 jQuery的核心理念是Write less,Do more。 使用jQuery可以兼容各种浏览器,方便的处理HTML、Events、动画效果等,并且方便的为网站提供AJAX交互。 2.jQuery的特点: 利用选择器来查找要操作的节点,然后将这些节点封装成一个jQuery对象,通过调用jQuery对象的方法或者属性来实现对底层被封装的节点的操作。 好处:a、兼容性更好;b、代码更简洁 3.编程步骤: step1、使用选择器查找节点 step2、调用jQuery的属性和方法 4.jQuery对象与DOM对象之间的转换 1. 什么是jQuery对象?? jQuery对象是jQuery对底层对象的一个封装,只有创建了这个对象,才能使用类库中提供的方法。 2. DOM对象 ----> jQuery对象 DOM对象向jQuery对象的转变很容易,外面追加$和圆括号即可。 function f( ){ var obj = document.getElementById(‘d1’); //DOM -> jQuery对象
var $obj = $(obj); $obj.html(‘hello jQuery’); } 3. jQuery对象 ----> DOM对象 jQuery对象向DOM对象转化,通过调用get方法加参数值0即可$obj.get(0)。 function f( ){ var $obj = $(‘#d1’); //jQuery对象 -> DOM var obj = $(obj).get (0); obj.innerHTML = ‘hello jQuery’; } 5. jQuery选择器 1. 什么是jQuery选择器?? jQuery选择器是一种类似CSS选择器的特殊说明符号,能够帮助jQuery 定位到要操作的元素上,使用了选择器可以帮助HTML实现内容与行为的分离。只需要在元素上加上Id属性。 2. 选择器的种类 a、基本选择器 #id根据指定的ID匹配一个元素 .class根据指定的类匹配一个元素 element根据的指定的元素名匹配所有的元素
JSON 数据格式解析 和 XML 一样,JSON 也是基于纯文本的数据格式。由于 JSON 天生是为JavaScript 准备的,因此,JSON 的数据格式非常简单,您可以用 JSON 传输一个简单的 String,Number,Boolean,也可以传输一个数组,或者一个复杂的Object 对象。 String,Number 和 Boolean 用 JSON 表示非常简单。例如,用 JSON 表示一个简单的 String “ abc ”,其格式为: "abc" 除了字符 ",\,/ 和一些控制符(\b,\f,\n,\r,\t)需要编码外,其他 Unicode 字符可以直接输出。下图是一个 String 的完整表示结构: 图 1. String 的完整表示结构 一个 Number 可以根据整型或浮点数表示如下:
图 2. Number 的表示结构 这与绝大多数编程语言的表示方法一致,例如: 12345(整数) -3.9e10(浮点数) Boolean 类型表示为 true 或 false 。此外,JavaScript 中的 null 被表示为 null,注意,true、false 和 null 都没有双引号,否则将被视为一个String 。 JSON 还可以表示一个数组对象,使用 [] 包含所有元素,每个元素用逗号分隔,元素可以是任意的 Value,例如,以下数组包含了一个 String,Number,Boolean 和一个 null: Object 对象在 JSON 中是用 {} 包含一系列无序的 Key-Value 键值对表示的,实际上此处的 Object 相当于 Java 中的 Map
啥叫异步,啥叫Ajax.咱不谈啥XMLHTTPRequest.通俗讲异步就是前台页面javascript能调用后台方法.这样就达到了无刷新.所谓的Ajax.这里我们讲二种方法 方法一:(微软有自带Ajax框架) 在https://www.doczj.com/doc/5710385731.html,里微软有自己的Ajax框架.就是在页面后台.cs文件里引入 using System.Web.Services 空间然后定义静态方法(方法前加上 [WebMethod]) [WebMethod] public static string ABC(string ABC) { return ABC; } 好了,现在我们谈谈前台Js怎么处理后台返回的数据吧,可利用Jquery处理返回的纯html,json,Xml等数据.这里我们演示返回返回的数据有string、集合(List<>)、类. 但都返回Json格式(Json轻量级比XML处理起来简单).看看前台是怎么解析这些数据的. 代码如下: 前台页面: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>