JSON

JSON 知识量:10 - 17 - 48

9.1 服务端的JSON操作><

序列化与反序列化- 9.1.1 -

对于JSON数据的操作,简单来说就是序列化与反序列化。一种数据交互格式要想在Web领域适用,就必须同时被客户端和服务端支持。JSON就可以在大部分服务端Web框架以及脚本语言中得到较好的支持。支持JSON的常用的编程语言有ASP.NET、PHP、Ruby on Rails、Node.js和Java等。

ASP.NET与JSON- 9.1.2 -

ASP.NET是由微软开发的服务端Web框架。它通过扩展允许开发人员使用一些不同的编程模型,例如ASP.NET MVC和ASP.NET Web API。此外,ASP.NET使用公共语言运行库(CLR),允许开发人员使用任何受CLR支持的语言来编写代码,例如:C#、F#、VB.NET等。在ASP.NET中通过第三方库来支持JSON,最流行的是Json.NET。

1、使用ASP.NET操作JSON。

以下是一个示例。首先创建一个用于操作的JSON对象:

public class Cars{
    public string carName{get;set}
    public string carNumber{get;set}
    public string carColor{get;set}
    public Size carSize{get;set}
}
public class Size{
    public string length{get;set}
    public string width{get;set}
    public string height{get;set}

新建一个对象来保存名为BMW的信息,最后使用Json.NET将对象序列化为JSON:

Cars BMW = new Cars();
BMW.carName = "BMW5";
BMW.carNumber = "G30";
BMW.carColor = "white";

Size BMW5Size = new Size();
BMW5Size.lenth = "5000";
BMW5Size.width = "2000";
BMW5Size.height = "1650";

BMW.carSize = BMW5Size;

string json = JsonConvert.SerializeObject(BMW);

序列化后的BMW对象为:

{
    "carName": "BMW5",
    "carNumber": "G30",
    "carColor": "white",
    "carSize": {
        "length": "5000",
        "width ": "2000",
        "height ": "1650"
    }
}

仅需要一行代码就可以将JSON反序列化为ASP.NET对象:

Cars BMW = JsonConvert.DeserializeObject<BMW>(json);

Json.NET允许将JSON反序列化为指定类型的对象,这样就能保证数据在出入服务端代码时保持自己原有的形态。需要注意的是,对象的属性名必须和JSON文档中的键值对的名称相吻合,否则,反序列化操作就会失败。

2、使用ASP.NET请求JSON数据。

可以通过ASP.NET中内置的System.Net.WebClient类来创建HTTP请求,通过调用DownloadString方法下载URL请求的资源,资源类型为字符串。例如从本地CouchDB数据库请求JSON数据:

using(var webClient = new WebClient())
{
    string json = webClient.DownloadString("456456ac4654354f486543544");
}

获取的JOSN资源类似于以下内容:

{
    "_id": "998456ac4654354f486543544",
    "_rev": "1-3e2466435464545468546468",
    "firstName": "John",
    "lastName": "James",
    "address": {
        "street": "552 sweet st",
        "city": "Forks",
        "state": "OR",
        "zip": "58942"
    },
    "age": 48,
    "gender": "male",
    "famous": false
}

PHP与JSON- 9.1.3 -

PHP是一种用于创建动态Web页面的服务端脚本语言。使用PHP时,可以直接将其代码嵌入HTML文档中。例如:

<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <?php
        echo"Hello pnotes.cn!";
        ?>
    </body>
</html>

此外,PHP还支持对象数据类型,例如定义一个Car的数据类:

class Car {

    public $name;
    public $number;
    public $color;

}

下面对其实例化,并赋值:

$BMW = new Car();
$BMW->name = "BMW";
$BMW->number = "56897";
$BMW->color = "white";

echo $BMW->name;

运行后,页面会输出:“BMW”。

PHP对JSON的序列化和反序列化操作也有内置的支持,在PHP中称为JSON的编码与解码。对某样东西进行编码的意思就是将其转为一种编码格式(即不可读的形式)。使用PHP序列化JSON时应调用json_encode函数,反序列化时应调用json_decode函数。

1、序列化JSON

将以上Car类的实例$BMW序列化:

$json = json_encode($BMW);

json_encode函数返回的结果为:

{
    "name": "BMW",
    "number": "56897",
    "color": "white"
}

2、反序列化JSON

PHP的json_decode函数用于反序列化JSON,但是并不支持将JSON反序列化为某种具体的PHP对象,所以,需要采取一些措施将数据重塑为对应的PHP对象。

首先,在类Car中添加一个函数loadFormJSON,用于通过JSON数据设置自己的属性。

class Car {

    public $name;
    public $number;
    public $color;

    public function loadFormJSON($json) {
        $object = json_decode($json);
        foreach ($object as $name => $value) {
            $this->{$name} = $value;
        }
    }
}

然后,创建新的Car对象,并调用loadFormJSON函数。

$json = json_encode($BMW);
$deserializedCar = new Car();
$deserializedCar->loadFormJSON($json);
echo $deserializedCar->name . " " . $deserializedCar->number . " " 
. $deserializedCar->color;

以上代码中,首先序列化JOSN数据为$json,然后创建了新的Car对象$deserializedCar,使用$deserializedCar的loadFormJSON函数,将JSON数据中的内容赋值给$deserializedCar的属性,最后将属性值打印出来。

3、请求JSON。

使用PHP内置的file_get_contents函数来创建HTTP请求。它将资源以字符串的形式返回,然后就可以将字符串反序列化为PHP对象。示例:从本地CouchDB数据库请求JSON数据并反序列化。

$url = "http//localhost:5984/cars/4564812546412215";
$json = file_get_contents($url);
$deserializedCar = new Car();
$deserializedCar->loadFormJSON($json);
echo $deserializedCar->name . " " . $deserializedCar->number . " " 
. $deserializedCar->color;