JS篇
<script>
//js对象
function person(firstname,lastname,age,eyecolor)
{
this.firstname=firstname;
this.lastname=lastname;
this.age=age;
this.eyecolor=eyecolor;
}
//实例化js对象
myFather=new person("Bill","Gates",56,"blue");
//js对象的序列化
myJson = JSON.stringify(myFather);
//js对象的反序列化
//方法1:
/*
* eval(string) 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
*
* eval()函数的问题是,它会将传入的字符串无差别的编译执行.如果从第三方服务器中获取
* 的JSON数据被替换为了恶意脚本,那我们的站点就会无辜蒙冤,在访问者的浏览器中执行恶
* 意代码.
*/
myObject1 = eval("(" + myJson + ")");
//方法2:
/*
* JSON.parse() 方法用于将一个 JSON 字符串转换为对象。
*
* JSON.parse() 函数用来处理eval()函数暴露出的问题,该函数会解析JSON,但并不会执行脚本.
* 这个函数也存在些问题,有些老旧版本的浏览器不支持这个函数,可能会导致我们的程序出错,因
* 此,可以用一种比较优雅的方式进行规避,比如弹窗提醒用户升级自己浏览器到最新版本.
*/
myObject2 = JSON.parse(myJson);
</script>
PHP篇
<?php
/*
* PHP对JSON的序列化与反序列化也有内置的支持.这类操作在PHP中称为JSON的编码与解码.对某样
* 东西进行编码的意思是将它转化为一种编码格式(即不可读的格式).解码的意思是将它转化为一种
* 可读的格式.对PHP来说,JSON是一种编码格式.因此,序列JSON时应调用json_encode()函数,反
* 序列化JSON时应调用json_decode()函数.
*/
class Account {
public $firstName;
public $lastName;
public $phone;
public $addresses;
}
class Address {
public $street;
public $city;
public $state;
}
$address1 = new Address();
$address1->street = '123';
$address1->city = '456';
$address1->state = '789';
$address2 = new Address();
$address2->street = 'abc';
$address2->city = 'def';
$address2->state = 'hij';
$account = new Account();
$account->firstName = 'song';
$account->lastName = 'ziqing';
$account->addresses = array($address1, $address2);
//序列化
$json = json_encode($account);
//反序列化
$obj = json_decode($json);
?>
特别注意:
经过json_decode()函数解码,返回的确是一个对象,但也只是一个对象,它不再是某个具体类的对象(如Account类),
不再有Account类中存在,但经过解码后的对象中不存在的一些类中的方法.
如果要将数据重塑为某个类(如Account类)对应的PHP对象,则必须采取一些措施,如下
<?php
/*
* 如果要将数据重塑为某个类(如Account类)对应的PHP对象,则必须采取一些措施.
*
* 向Account类中添加一个新函数loadFromJSON,该函数会调用内置的json_decode()函数反序列化一个一般的PHP对象,然后在foreach
* 循环中遍历该对象的属性,并赋值给Account对象中名称相同的属性.
*/
class Account {
public $firstName;
public $lastName;
public $phone;
public $addresses;
public function loadFormJSON($json) {
$object = json_decode($json);
foreach ($object as $name => $value) {
$this->{$name} = $value;
}
}
}
class Address {
public $street;
public $city;
public $state;
}
$address1 = new Address();
$address1->street = '123';
$address1->city = '456';
$address1->state = '789';
$address2 = new Address();
$address2->street = 'abc';
$address2->city = 'def';
$address2->state = 'hij';
$account = new Account();
$account->firstName = 'song';
$account->lastName = 'ziqing';
$account->addresses = array($address1, $address2);
//序列化
$json = json_encode($account);
//反序列化并转化为Account类的对象
$deserializedAccount = new Account();
$deserializedAccount -> loadFormJSON($json);
var_dump($deserializedAccount);
?>