JsonSerializable
在线手册:中文  英文

JsonSerializable::jsonSerialize

(PHP 5 >= 5.4.0)

JsonSerializable::jsonSerialize指定需要被序列化成 JSON 的数据

说明

abstract public mixed JsonSerializable::jsonSerialize ( void )

序列化物体(Object)成能被 json_encode() 原生地序列化的值。

参数

此函数没有参数。

返回值

返回能被 json_encode() 序列化的数据, 这个值可以是除了 resource 外的任意类型。

范例

Example #1 JsonSerializable::jsonSerialize() 例子 returning an array

<?php
class ArrayValue implements JsonSerializable {
    public function 
__construct(array $array) {
        
$this->array $array;
    }

    public function 
jsonSerialize() {
        return 
$this->array;
    }
}

$array = [123];
echo 
json_encode(new ArrayValue($array), JSON_PRETTY_PRINT);
?>

以上例程会输出:

[
    1,
    2,
    3
]

Example #2 JsonSerializable::jsonSerialize() 例子 返回了一个关联数组 array

<?php
class ArrayValue implements JsonSerializable {
    public function 
__construct(array $array) {
        
$this->array $array;
    }

    public function 
jsonSerialize() {
        return 
$this->array;
    }
}

$array = ['foo' => 'bar''quux' => 'baz'];
echo 
json_encode(new ArrayValue($array), JSON_PRETTY_PRINT);
?>

以上例程会输出:

{
    "foo": "bar",
    "quux": "baz"
}

Example #3 JsonSerializable::jsonSerialize() 例子 返回一个 integer

<?php
class IntegerValue implements JsonSerializable {
    public function 
__construct($number) {
        
$this->number = (integer) $number;
    }

    public function 
jsonSerialize() {
        return 
$this->number;
    }
}

echo 
json_encode(new IntegerValue(1), JSON_PRETTY_PRINT);
?>

以上例程会输出:

1

Example #4 JsonSerializable::jsonSerialize() 例子 返回一个 string

<?php
class StringValue implements JsonSerializable {
    public function 
__construct($string) {
        
$this->string = (string) $string;
    }

    public function 
jsonSerialize() {
        return 
$this->string;
    }
}

echo 
json_encode(new StringValue('Hello!'), JSON_PRETTY_PRINT);
?>

以上例程会输出:

"Hello!"


JsonSerializable
在线手册:中文  英文

用户评论:

benkuhl at gmail dot com (2013-01-31 16:17:40)

A good example on when you would use functionality like this is when working with objects.

json_encode() will take a DateTime and convert it to:

{
    "date":"2013-01-31 11:14:05",
    "timezone_type":3,
    "timezone":"America\/Los_Angeles"
}

This is great when working with PHP, but if the Date is being read by Java.  The Java date parser doesn't know what to do with that.  But it does know what to do with the ISO8601 format...

<?php

date_default_timezone_set
('America/Los_Angeles');

class 
Fruit implements JsonSerializable {
    public
        
$type 'Apple',
        
$lastEaten null;

    public function 
__construct() {
        
$this->lastEaten = new DateTime();
    }

    public function 
jsonSerialize() {
        return [
            
'type' => $this->type,
            
'lastEaten' => $this->lastEaten->format(DateTime::ISO8601)
        ];
    }
}
echo 
json_encode(new Fruit()); //which outputs: {"type":"Apple","lastEaten":"2013-01-31T11:17:07-0500"}

?>

易百教程