对于JSON,从未真正完整学习过,只是在做公司OA时,因为使用到了ExtJS,才略有耳闻。昨日,碰到一个以前从未碰到的问题,就是前台的JSON字符串传到后台如何解析的问题。以前都是后台的数据变成JSON字符串传到前台由ExtJs自己解析。这回不一样了,顺序刚刚相反。由于使用的是.net 2.0的,没有传说中3.5自带的JSON解析类,所以便到网上下载了个newstonsoft的JSON.NET。引入dll后,捣鼓半天没出来我想要的结果。 我前台的返回的JSON字符串是:
[{
"
id
"
:
"
123
"
,
"
home
"
:
"
256
"
,
"
temp
"
,
"
240
"
},{
"
id
"
:
"
254
"
,
"
home
"
:
"
600
"
},{
"
id
"
:
"
123
4"
,temp
"
,
"
240
"
}]
,而我后台想要的是把它们解析成如下的SQL语句
update
tableExample
set
home
=
'
256
'
,
temp
=
'
240
'
where
id
=
'
123
'
update
tableExample
set
home
=
'
600
'
where
id
=
'
254
'
update
tableExample
set
temp
=
'
240
'
where
id
=
'
1234
'
说真的,我不知道上述的字符串算不算JSON字符串,因为我还看到过{[{"id":"123"},{"id":"123"},{"id":"2222"}]}这样的格式。但是我知道那个JSON字符串在JS里其实就是个Array,而这个Array的内容就是3个Js Object:
回过头来,我们看看JS里如何定义Array和Object。
定义Array.
var
varArray
=
new
Array();
或者直接赋值
var
varArray
=
new
Arrau([
"
Apple
"
,
"
Pear
"
,
"
Orange
"
]) ;
定义Object
var
varObject
=
new
Object();
或者直接赋值
var
varObject
=
new
Object({
"
id
"
:
"
123
"
,
"
home
"
:
"
256
"
,
"
temp
"
,
"
240
"
});
这样看我刚刚那个JSON字符串,也可以这样赋值给一个Array,因为它符合数组格式-用[]括起来,同时里面的元素用字符,隔开,不是吗?
var
varArrau
=
new
Array([{
"
id
"
:
"
123
"
,
"
home
"
:
"
256
"
,
"
temp
"
,
"
240
"
},{
"
id
"
:
"
254
"
,
"
home
"
:
"
600
"
},{
"
id
"
:
"
1234
"
,temp
"
,
"
240
"
}])
这里我们可以看出JS里的数组里的内容可以是任何东西,包括Object。
那我们这样推论JSON其实就是JS格式的Array与Object的混装。那么谈到这里要解决实际问题,该这么把那串字符串变成我想要的SQL语句呢?用正则?Split拆分?
我的天啊。那都是头疼的事情。其实我们刚刚已经分析过了,那串JSON字符串其实就是一个数组,而数组里放了3个Object。那我们为何不直接用JS遍历一下这个数组,把里面的Object取出来,再遍历里面的Object,把Object的属性及值取出来呢?JS脚本如下:
var
pageDto
=
new
String();
var
varChangeId
=
new
Array();
pageDto
=
pageDto.concat(
"
[
"
);
for
(
var
i
=
0
; i
<
updateDate.length; i
++
) {
varChangeId.push(updateDate[i].data.id);
pageDto
=
pageDto.concat(Ext.encode(updateDate[i].getChanges()));
//
GetChanges获得修改过的字段和value
if
((i
+
1
)
!=
updateDate.length) {
pageDto
=
pageDto.concat(
"
,
"
);
}
}
pageDto
=
pageDto.concat(
"
]
"
);//这里的pageDto就是上文提到的JSON字符串了
var
xxx
=
new
Array();
var
varTotalSql
=
""
;
xxx
=
Ext.util.JSON.decode(pageDto);
for
(
var
i
=
0
; i
<
xxx.length; i
++
) {//第一个循环是循环3个Object
for
(m
in
xxx[i]) {//第二个循环是循环每个Object里的属性及值。
varTotalSql
+=
m
+
"
='
"
+
xxx[i][m]
+
"
',
"
;//属性与值拼凑成SQL中需更新的字段
}
varTotalSql
=
varTotalSql.substring(
0
, varTotalSql.length
-
1
);
//
去掉最后一个,
varTotalSql
+=
"
where id='
"
+
varChangeId[i]
+
"
'$
"
;//得到3个SQL语句,通过$号隔开。
}
得到的字符串在后台通过Split分割$,得到一个数组,然后循环执行更新数据库。
UpdateTable.aspx.cs
protected
void
Page_Load(
object
sender, EventArgs e)
{
Response.Clear();
SQLdal.ShellUrl Wo
=
new
SQLdal.ShellUrl();
string
strJson
=
Request.Params[
"
testP
"
].ToString();
string
[] arrJson
=
strJson.Split(
new
char
[] {
'
$
'
},StringSplitOptions.RemoveEmptyEntries);
foreach
(
string
i
in
arrJson)
{
Wo.bolUpAllSql(
"
update shell set
"
+
i);
}
}
.net的反序列化类没弄明白,第三方的.dll又没整出来。只好自己用JS解析。
当然通过$分割3个SQL语句还是有风险,万一SQL语句里就有$呢?解决办法就是,在js循环中调用Ajax 执行UpdateTable.aspx.cs ,
当然UpdateTable.aspx.cs 就要改动成不需要循环的。
根基不牢,地动山摇,看着技术一天发展,我们缺没法跟上,叹息之余,只有自我安慰:回过头来看看《深入浅出JavaScript》,夯实基础吧,有了基础,一切尽在掌握。