Skip to content
This repository was archived by the owner on Dec 23, 2021. It is now read-only.

Commit 306a5b9

Browse files
committed
Merged pull request #148
2 parents 5263949 + 0618996 commit 306a5b9

11 files changed

+321
-9
lines changed

ext_mongodb.php

Lines changed: 80 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -945,7 +945,7 @@ public function unserialize(mixed $data) : void
945945
}
946946
}
947947

948-
final class Binary implements Type, \Serializable
948+
final class Binary implements Type, \Serializable, \JsonSerializable
949949
{
950950
static private function checkArray(array $state)
951951
{
@@ -966,6 +966,14 @@ public function serialize() : string
966966
] );
967967
}
968968

969+
public function jsonSerialize() : mixed
970+
{
971+
return [
972+
'$binary' => base64_encode( $this->data ),
973+
'$type' => sprintf( "%02x", $this->type )
974+
];
975+
}
976+
969977
public function unserialize(mixed $serialized) : void
970978
{
971979
$unserialized = unserialize( $serialized );
@@ -1012,7 +1020,7 @@ function __debugInfo() : array;
10121020
}
10131021

10141022
<<__NativeData("MongoDBBsonDecimal128")>>
1015-
final class Decimal128 implements Type, \Serializable
1023+
final class Decimal128 implements Type, \Serializable, \JsonSerializable
10161024
{
10171025
static private function checkArray(array $state)
10181026
{
@@ -1030,6 +1038,13 @@ public function serialize() : string
10301038
] );
10311039
}
10321040

1041+
public function jsonSerialize() : mixed
1042+
{
1043+
return [
1044+
'$numberDecimal' => (string) $this->dec
1045+
];
1046+
}
1047+
10331048
public function unserialize(mixed $serialized) : void
10341049
{
10351050
$unserialized = unserialize( $serialized );
@@ -1053,7 +1068,7 @@ function __toString() : string;
10531068
function __debugInfo() : array;
10541069
}
10551070

1056-
final class Javascript implements Type, \Serializable
1071+
final class Javascript implements Type, \Serializable, \JsonSerializable
10571072
{
10581073
private $code;
10591074
private $scope;
@@ -1084,6 +1099,11 @@ public function serialize() : string
10841099
return serialize( $s );
10851100
}
10861101

1102+
public function jsonSerialize() : mixed
1103+
{
1104+
return $this->code;
1105+
}
1106+
10871107
public function unserialize(mixed $serialized) : void
10881108
{
10891109
$unserialized = unserialize( $serialized );
@@ -1145,13 +1165,20 @@ public function __toString() : string
11451165
}
11461166
}
11471167

1148-
final class MaxKey implements Type, \Serializable
1168+
final class MaxKey implements Type, \Serializable, \JsonSerializable
11491169
{
11501170
public function serialize() : string
11511171
{
11521172
return '';
11531173
}
11541174

1175+
public function jsonSerialize() : mixed
1176+
{
1177+
return [
1178+
'$maxKey' => 1
1179+
];
1180+
}
1181+
11551182
public function unserialize(mixed $serialized) : void
11561183
{
11571184
}
@@ -1162,13 +1189,20 @@ static public function __set_state(array $state)
11621189
}
11631190
}
11641191

1165-
final class MinKey implements Type, \Serializable
1192+
final class MinKey implements Type, \Serializable, \JsonSerializable
11661193
{
11671194
public function serialize() : string
11681195
{
11691196
return '';
11701197
}
11711198

1199+
public function jsonSerialize() : mixed
1200+
{
1201+
return [
1202+
'$minKey' => 1
1203+
];
1204+
}
1205+
11721206
public function unserialize(mixed $serialized) : void
11731207
{
11741208
}
@@ -1180,7 +1214,7 @@ static public function __set_state(array $state)
11801214
}
11811215

11821216
<<__NativeData("MongoDBBsonObjectID")>>
1183-
final class ObjectID implements Type, \Serializable
1217+
final class ObjectID implements Type, \Serializable, \JsonSerializable
11841218
{
11851219
static private function checkArray( array $state )
11861220
{
@@ -1198,6 +1232,13 @@ public function serialize() : string
11981232
] );
11991233
}
12001234

1235+
public function jsonSerialize() : mixed
1236+
{
1237+
return [
1238+
'$oid' => $this->__toString()
1239+
];
1240+
}
1241+
12011242
public function unserialize(mixed $serialized) : void
12021243
{
12031244
$unserialized = unserialize( $serialized );
@@ -1226,7 +1267,7 @@ public function getTimestamp() : int
12261267
}
12271268
}
12281269

1229-
final class Regex implements Type, \Serializable
1270+
final class Regex implements Type, \Serializable, \JsonSerializable
12301271
{
12311272
private $pattern;
12321273
private $flags;
@@ -1250,6 +1291,14 @@ public function serialize() : string
12501291
] );
12511292
}
12521293

1294+
public function jsonSerialize() : mixed
1295+
{
1296+
return [
1297+
'$regex' => $this->pattern,
1298+
'$options' => $this->flags,
1299+
];
1300+
}
1301+
12531302
public function unserialize(mixed $serialized) : void
12541303
{
12551304
$unserialized = unserialize( $serialized );
@@ -1302,7 +1351,7 @@ public function __debugInfo() : array
13021351
}
13031352
}
13041353

1305-
final class Timestamp implements Type, \Serializable
1354+
final class Timestamp implements Type, \Serializable, \JsonSerializable
13061355
{
13071356
static private function checkArray( array $state )
13081357
{
@@ -1338,6 +1387,16 @@ public function serialize() : string
13381387
] );
13391388
}
13401389

1390+
public function jsonSerialize() : mixed
1391+
{
1392+
return [
1393+
'$timestamp' => [
1394+
't' => (int) $this->timestamp,
1395+
'i' => (int) $this->increment,
1396+
]
1397+
];
1398+
}
1399+
13411400
public function unserialize(mixed $serialized) : void
13421401
{
13431402
$unserialized = unserialize( $serialized );
@@ -1389,7 +1448,7 @@ public function __debugInfo() : array
13891448
}
13901449
}
13911450

1392-
final class UTCDateTime implements Type, \Serializable
1451+
final class UTCDateTime implements Type, \Serializable, \JsonSerializable
13931452
{
13941453
private string $milliseconds;
13951454

@@ -1410,6 +1469,18 @@ public function serialize() : string
14101469
] );
14111470
}
14121471

1472+
public function jsonSerialize() : mixed
1473+
{
1474+
$seconds = (int) ( $this->milliseconds / 1000 );
1475+
$millis = (int) ( $this->milliseconds % 1000 );
1476+
1477+
$d = date_create( "@" . (string) $seconds );
1478+
1479+
return [
1480+
'$date' => sprintf( "%s.%03d+0000", $d->format( 'Y-m-d\TH:i:s' ), $millis )
1481+
];
1482+
}
1483+
14131484
public function unserialize(mixed $serialized) : void
14141485
{
14151486
$unserialized = unserialize( $serialized );

tests/json-serialize-binary.phpt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
JsonSerializable: Binary
3+
--FILE--
4+
<?php
5+
$doc = [
6+
'foo' => new MongoDB\BSON\Binary( "gargleblaster", 24 )
7+
];
8+
9+
echo MongoDB\BSON\toJSON( \MongoDB\BSON\fromPHP( $doc ) ), "\n";
10+
$d = json_encode( $doc );
11+
echo $d, "\n";
12+
13+
var_dump( \MongoDB\BSON\toPHP( \MongoDB\BSON\fromJSON( $d ) ) );
14+
?>
15+
--EXPECTF--
16+
{ "foo" : { "$binary" : "Z2FyZ2xlYmxhc3Rlcg==", "$type" : "18" } }
17+
{"foo":{"$binary":"Z2FyZ2xlYmxhc3Rlcg==","$type":"18"}}
18+
object(stdClass)#%d (%d) {
19+
["foo"]=>
20+
object(MongoDB\BSON\Binary)#%d (%d) {
21+
["data"]=>
22+
string(13) "gargleblaster"
23+
["type"]=>
24+
int(24)
25+
}
26+
}

tests/json-serialize-decimal128.phpt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
JsonSerializable: Decimal128
3+
--FILE--
4+
<?php
5+
$doc = [
6+
'foo' => new MongoDB\BSON\Decimal128( "12389719287312" )
7+
];
8+
9+
echo MongoDB\BSON\toJSON( \MongoDB\BSON\fromPHP( $doc ) ), "\n";
10+
$d = json_encode( $doc );
11+
echo $d, "\n";
12+
13+
var_dump( \MongoDB\BSON\toPHP( \MongoDB\BSON\fromJSON( $d ) ) );
14+
?>
15+
--EXPECTF--
16+
{ "foo" : { "$numberDecimal" : "12389719287312" } }
17+
{"foo":{"$numberDecimal":"12389719287312"}}
18+
object(stdClass)#%d (%d) {
19+
["foo"]=>
20+
object(MongoDB\BSON\Decimal128)#%d (%d) {
21+
["dec"]=>
22+
string(14) "12389719287312"
23+
}
24+
}

tests/json-serialize-javascript.phpt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
--TEST--
2+
JsonSerializable: Javascript
3+
--FILE--
4+
<?php
5+
$doc = [
6+
'foo' => new MongoDB\BSON\Javascript( "function foo(bar) { return bar; }", [ 'foo' => 42 ] )
7+
];
8+
9+
echo MongoDB\BSON\toJSON( \MongoDB\BSON\fromPHP( $doc ) ), "\n";
10+
$d = json_encode( $doc );
11+
echo $d, "\n";
12+
13+
var_dump( \MongoDB\BSON\toPHP( \MongoDB\BSON\fromJSON( $d ) ) );
14+
?>
15+
--EXPECTF--
16+
{ "foo" : "function foo(bar) { return bar; }" }
17+
{"foo":"function foo(bar) { return bar; }"}
18+
object(stdClass)#%d (%d) {
19+
["foo"]=>
20+
string(33) "function foo(bar) { return bar; }"
21+
}

tests/json-serialize-maxkey.phpt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
JsonSerializable: MaxKey
3+
--FILE--
4+
<?php
5+
$doc = [
6+
'foo' => new MongoDB\BSON\MaxKey()
7+
];
8+
9+
echo MongoDB\BSON\toJSON( \MongoDB\BSON\fromPHP( $doc ) ), "\n";
10+
$d = json_encode( $doc );
11+
echo $d, "\n";
12+
13+
var_dump( \MongoDB\BSON\toPHP( \MongoDB\BSON\fromJSON( $d ) ) );
14+
?>
15+
--EXPECTF--
16+
{ "foo" : { "$maxKey" : 1 } }
17+
{"foo":{"$maxKey":1}}
18+
object(stdClass)#%d (%d) {
19+
["foo"]=>
20+
object(MongoDB\BSON\MaxKey)#%d (%d) {
21+
}
22+
}

tests/json-serialize-minkey.phpt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
--TEST--
2+
JsonSerializable: MinKey
3+
--FILE--
4+
<?php
5+
$doc = [
6+
'foo' => new MongoDB\BSON\MinKey()
7+
];
8+
9+
echo MongoDB\BSON\toJSON( \MongoDB\BSON\fromPHP( $doc ) ), "\n";
10+
$d = json_encode( $doc );
11+
echo $d, "\n";
12+
13+
var_dump( \MongoDB\BSON\toPHP( \MongoDB\BSON\fromJSON( $d ) ) );
14+
?>
15+
--EXPECTF--
16+
{ "foo" : { "$minKey" : 1 } }
17+
{"foo":{"$minKey":1}}
18+
object(stdClass)#%d (%d) {
19+
["foo"]=>
20+
object(MongoDB\BSON\MinKey)#%d (%d) {
21+
}
22+
}

tests/json-serialize-objectid.phpt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
JsonSerializable: ObjectID
3+
--FILE--
4+
<?php
5+
$doc = [
6+
'foo' => new MongoDB\BSON\ObjectID()
7+
];
8+
9+
echo MongoDB\BSON\toJSON( \MongoDB\BSON\fromPHP( $doc ) ), "\n";
10+
$d = json_encode( $doc );
11+
echo $d, "\n";
12+
13+
var_dump( \MongoDB\BSON\toPHP( \MongoDB\BSON\fromJSON( $d ) ) );
14+
?>
15+
--EXPECTF--
16+
{ "foo" : { "$oid" : "%s" } }
17+
{"foo":{"$oid":"%s"}}
18+
object(stdClass)#%d (%d) {
19+
["foo"]=>
20+
object(MongoDB\BSON\ObjectID)#%d (%d) {
21+
["oid"]=>
22+
string(24) "%s"
23+
}
24+
}

tests/json-serialize-regex-001.phpt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
JsonSerializable: Regex
3+
--FILE--
4+
<?php
5+
$doc = [
6+
'foo' => new MongoDB\BSON\Regex( "/foo/", "i" )
7+
];
8+
9+
echo MongoDB\BSON\toJSON( \MongoDB\BSON\fromPHP( $doc ) ), "\n";
10+
$d = json_encode( $doc );
11+
echo $d, "\n";
12+
13+
var_dump( \MongoDB\BSON\toPHP( \MongoDB\BSON\fromJSON( $d ) ) );
14+
?>
15+
--EXPECTF--
16+
{ "foo" : { "$regex" : "/foo/", "$options" : "i" } }
17+
{"foo":{"$regex":"\/foo\/","$options":"i"}}
18+
object(stdClass)#%d (%d) {
19+
["foo"]=>
20+
object(MongoDB\BSON\Regex)#%d (%d) {
21+
["pattern"]=>
22+
string(%d) "/foo/"
23+
["flags"]=>
24+
string(%d) "i"
25+
}
26+
}

0 commit comments

Comments
 (0)