最近看到gmail和sohu的blog都在使用json传输数据,感觉比直接传输文本和xml效率会高一些,大家一起讨论~~~ json给我感觉有点象php中的序列化和反序列化,把数组等数据格式转化为一个特定的字符串,可以节省空间或者带宽,需要时在恢复回来。
附: JSON-PHP类库下载及手册
JSON一种轻量级的数据格式,由一位资深的软件工程师Douglas Crockford开发,全称为Javascript Object Notation。中文翻译为“JavaScript对象表示”,这个格式的数据可以很容易的被转换为javascript对象的格式,用于服务器端和客户端的数据传递,用于解决xml的过多冗余标签造成数据传输量过大的问题。
JSON-PHP是一个自动完成JSON编码和解码的php开源代码工具。
下载:http://www.eb163.com/code/json.rar
其中的TEST_JSON.php中包含了PHPUnit.php,是PEAR自带的单元测试工具,实际开发中可以不用。
示例代码:
//
create a new instance of Services_JSON
require_once
(
'
JSON.php
'
);
$json
=
new
Services_JSON();
//
convert a complex value to JSON notation
$value
=
array
(
1
,
2
,
'
foo
'
);
$output
=
$json
->
encode(
$value
);
print
(
$output
);
//
accept incoming POST data
$input
=
$GLOBALS
[
'
HTTP_RAW_POST_DATA
'
];
$value
=
$json
->
decode(
$input
);
相关评论 作者: 猪 发布日期: 2006-8-19 是个好东东,偶也在看 作者: ccxxcc 发布日期: 2006-8-21 昨天测试了下 似乎不支持gb2312,用gb232的页面就会JSON.php报错 也许要转码才行,有空再试试 下面的代码需要utf-8文件,不然会出错
<?
php
require_once
'
JSON.php
'
;
$json
=
new
Services_JSON();
$value
=
array
(
array
(
"
title
"
=>
"
学习php
"
,
"
content
"
=>
"
一切刚刚开始
"
)
,
array
(
"
title
"
=>
"
学习javascript
"
,
"
content
"
=>
"
《javascript权威指南》真厚!
"
)
,
array
(
"
title
"
=>
"
学习ajax
"
,
"
content
"
=>
"
ajax,轻轻的来!
"
)
,
);
$output
=
$json
->
encode(
$value
);
?>
<
script language
=
"
javascript
"
src
=
"
json.js
"
></
script
>
<
script language
=
"
javascript
"
>
<!--
var
json
=
JSON
.
parse(
'
<?=$output?>
'
);
var
order
=
0
;
for
(
var
i
=
0
;i
<
json
.
length;i
++
) { order
=
i
+
1
; document
.
write(order
+
"
<br />
"
); document
.
write(
"
<span style='color:red'>
"
+
json[
'
title
'
]
+
"
</span>
"
); document
.
write(
"
<div style='color:green'>
"
+
json[
'
content
'
]
+
"
</div>
"
); document
.
write(
"
<br />
"
); }
//
-->
</
script
>
作者: aninfeel 发布日期: 2006-8-21 xml就是为了防止乱码吧? 作者: 猪 发布日期: 2006-8-21 对的,他必须 是U8的编码 作者: 刀鱼 发布日期: 2006-8-21 我也试下去... 作者: sanders_yao 发布日期: 2006-8-21 我使用json的时候就是这样 似乎必须是utf-8才能正常显示
总的来说json是专门为js准备的 而xml不光是为js准备的 只不过js的方法可以解析它罢了 作者: LuckLrj 发布日期: 2006-8-23 我用gb2312怎么没出问题……难道是我人品太好了??? 作者: lankelan 发布日期: 2006-9-06 查看源代码,发现JSON试图将非ASCII字符转成UTF16格式,而处理过程中并未对GB有特殊处理,所以会导致错误。
分析了Json.js,在Script这一层上,Json并未对中文进行特殊编码处理。为何在PHP中要多此一举呢? 大概是为了跨平台传输的原因。
解决方法三个:
1,写一个GB2UTF16函数放进去。
2,采用其他编码作为中介。比如:nbase64
3,干脆不做处理。这个最简单。
根据需求,后台与前端均采用GB,UTF转码并无意义。动手改就很容易了。
decode函数中,找到:
case 'string':
将处理编码的地方全去掉:
case
((
$ord_var_c
>=
0x20
)
&&
(
$ord_var_c
<=
0x7F
))
:
//
characters U-00000000 - U-0000007F (same as ASCII)
$ascii
.=
$var
{
$c
};
break
;
case
((
$ord_var_c
&
0xE0
)
==
0xC0
)
:
//
characters U-00000080 - U-000007FF, mask 110XXXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char
=
pack
(
'
C*
'
,
$ord_var_c
,
ord
(
$var
{
$c
+
1
}));
$c
+=
1
;
$utf16
=
$this
->
utf82utf16(
$char
);
$ascii
.=
sprintf
(
'
u%04s
'
,
bin2hex
(
$utf16
));
break
;
case
((
$ord_var_c
&
0xF0
)
==
0xE0
)
:
//
characters U-00000800 - U-0000FFFF, mask 1110XXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char
=
pack
(
'
C*
'
,
$ord_var_c
,
ord
(
$var
{
$c
+
1
})
,
ord
(
$var
{
$c
+
2
}));
$c
+=
2
;
$utf16
=
$this
->
utf82utf16(
$char
);
$ascii
.=
sprintf
(
'
u%04s
'
,
bin2hex
(
$utf16
));
break
;
case
((
$ord_var_c
&
0xF8
)
==
0xF0
)
:
//
characters U-00010000 - U-001FFFFF, mask 11110XXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char
=
pack
(
'
C*
'
,
$ord_var_c
,
ord
(
$var
{
$c
+
1
})
,
ord
(
$var
{
$c
+
2
})
,
ord
(
$var
{
$c
+
3
}));
$c
+=
3
;
$utf16
=
$this
->
utf82utf16(
$char
);
$ascii
.=
sprintf
(
'
u%04s
'
,
bin2hex
(
$utf16
));
break
;
case
((
$ord_var_c
&
0xFC
)
==
0xF8
)
:
//
characters U-00200000 - U-03FFFFFF, mask 111110XX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char
=
pack
(
'
C*
'
,
$ord_var_c
,
ord
(
$var
{
$c
+
1
})
,
ord
(
$var
{
$c
+
2
})
,
ord
(
$var
{
$c
+
3
})
,
ord
(
$var
{
$c
+
4
}));
$c
+=
4
;
$utf16
=
$this
->
utf82utf16(
$char
);
$ascii
.=
sprintf
(
'
u%04s
'
,
bin2hex
(
$utf16
));
break
;
case
((
$ord_var_c
&
0xFE
)
==
0xFC
)
:
//
characters U-04000000 - U-7FFFFFFF, mask 1111110X // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char
=
pack
(
'
C*
'
,
$ord_var_c
,
ord
(
$var
{
$c
+
1
})
,
ord
(
$var
{
$c
+
2
})
,
ord
(
$var
{
$c
+
3
})
,
ord
(
$var
{
$c
+
4
})
,
ord
(
$var
{
$c
+
5
}));
$c
+=
5
;
$utf16
=
$this
->
utf82utf16(
$char
);
$ascii
.=
sprintf
(
'
u%04s
'
,
bin2hex
(
$utf16
));
break
; 然后加上:
default
:
$ascii
.=
chr
(
$ord_var_c
);
break
; 测试OK。 encode函数中也是一样,把编码的部分去掉,换上
default
:
$utf8
.=
chr
(
$ord_chrs_c
);