JsonSerializable::jsonSerialize

(PHP 5 >= 5.4.0, PHP 7, PHP 8)

JsonSerializable::jsonSerializeEspecifica los datos que deberían serializarse para JSON

Descripción

abstract public JsonSerializable::jsonSerialize(): mixed

Serializa el objeto a un valor que puede ser serializado de forma nativa por json_encode().

Parámetros

Esta función no tiene parámetros.

Valores devueltos

Devuelve los datos que pueden ser serializados por json_encode(), los cuales son un valor de cualquier tipo distinto de resource.

Ejemplos

Ejemplo #1 Ejemplo de JsonSerializable::jsonSerialize() devolviendo un array

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

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

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

El resultado del ejemplo sería:

[
    1,
    2,
    3
]

Ejemplo #2 Ejemplo de JsonSerializable::jsonSerialize() devolviendo un array asociativo

<?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);
?>

El resultado del ejemplo sería:

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

Ejemplo #3 Ejemplo de JsonSerializable::jsonSerialize() devolviento un 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);
?>

El resultado del ejemplo sería:

1

Ejemplo #4 Ejemplo de JsonSerializable::jsonSerialize() devolviendo un 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('¡Hola!'), JSON_PRETTY_PRINT);
?>

El resultado del ejemplo sería:

"¡Hola!"

add a note

User Contributed Notes 4 notes

up
78
benkuhl at gmail dot com
12 years ago
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...<?phpdate_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"}?>
up
17
tomasz dot darmetko at gmail dot com
8 years ago
Nested json serializable objects will be serialized recursively. No need to call ->jsonSerialize() on your own. It is especially useful in collections.<?phpclass NestedSerializable implements \JsonSerializable{    private $serializable;    public function __construct($serializable)    {        $this->serializable = $serializable;    }    public function jsonSerialize()    {        return [            'serialized' => $this->serializable        ];    }}class SerializableCollection implements \JsonSerializable {    private $elements;    public function __construct(array $elements)    {        $this->elements = $elements;    }    public function jsonSerialize()    {        return $this->elements;    }}// Outputs: [{"serialized":null},{"serialized":null},{"serialized":{"serialized":null}}]echo json_encode(    new SerializableCollection([        new NestedSerializable(null),        new NestedSerializable(null),        new NestedSerializable(new NestedSerializable(null))    ]));?>
up
5
info at digistratum dot com
8 years ago
Here's a small test/proof that makes it easy to see some comparative results. Null was the one I was interested in since it was not documented:<?phpclass jsontest implements JsonSerializable {        function __construct($value) { $this->value = $value; }        function jsonSerialize() { return $this->value; }}print "Null -> " . json_encode(new jsontest(null)) . "\n";print "Array -> " . json_encode(new jsontest(Array(1,2,3))) . "\n";print "Assoc. -> " . json_encode(new jsontest(Array('a'=>1,'b'=>3,'c'=>4))) . "\n";print "Int -> " . json_encode(new jsontest(5)) . "\n";print "String -> " . json_encode(new jsontest('Hello, World!')) . "\n";print "Object -> " . json_encode(new jsontest((object) Array('a'=>1,'b'=>3,'c'=>4))) . "\n";?>Output is:Null -> nullArray -> [1,2,3]Assoc. -> {"a":1,"b":3,"c":4}Int -> 5String -> "Hello, World!"Object -> {"a":1,"b":3,"c":4}
up
1
david at vanlaatum dot id dot au
10 years ago
simonsimcity at gmail dot com is wrong, you can throw exceptions in this but it will wrap with another exception so his example outputs PHP Fatal error:  Uncaught exception 'RuntimeException' with message 'It failed!' in -:8 Stack trace: #0 [internal function]: Foo->jsonSerialize() #1 -(16): json_encode(Object(Foo)) #2 {main} Next exception 'Exception' with message 'Failed calling Foo::jsonSerialize()' in -:16 Stack trace: #0 -(0): json_encode() #1 {main}   thrown in - on line 16PHP 5.4.39
To Top