aboutsummaryrefslogtreecommitdiffhomepage
path: root/php/src/Google/Protobuf/Internal/Message.php
diff options
context:
space:
mode:
authorGravatar Jack Wakefield <jackwakefield91@gmail.com>2017-09-10 23:17:50 +0100
committerGravatar Paul Yang <TeBoring@users.noreply.github.com>2017-09-10 15:17:50 -0700
commit174c82d8cef27be5cb9d8491dd1e26d27898870b (patch)
tree88566308f3395a0990e0bd3f54cb0fbe4897daa5 /php/src/Google/Protobuf/Internal/Message.php
parent2ad5c0a86443f567241e0295c313baf4f0e15379 (diff)
Add well-known timestamps to JSON for PHP (#3564)
Diffstat (limited to 'php/src/Google/Protobuf/Internal/Message.php')
-rw-r--r--php/src/Google/Protobuf/Internal/Message.php87
1 files changed, 56 insertions, 31 deletions
diff --git a/php/src/Google/Protobuf/Internal/Message.php b/php/src/Google/Protobuf/Internal/Message.php
index 8886e61a..c0a3218b 100644
--- a/php/src/Google/Protobuf/Internal/Message.php
+++ b/php/src/Google/Protobuf/Internal/Message.php
@@ -699,12 +699,25 @@ class Message
switch ($field->getType()) {
case GPBType::MESSAGE:
$klass = $field->getMessageType()->getClass();
- if (!is_object($value) && !is_array($value)) {
- throw new \Exception("Expect message.");
- }
$submsg = new $klass;
- if (!is_null($value) &&
- $klass !== "Google\Protobuf\Any") {
+
+ if ($field->isTimestamp()) {
+ if (!is_string($value)) {
+ throw new GPBDecodeException("Expect string.");
+ }
+ try {
+ $timestamp = GPBUtil::parseTimestamp($value);
+ } catch (\Exception $e) {
+ throw new GPBDecodeException("Invalid RFC 3339 timestamp: ".$e->getMessage());
+ }
+
+ $submsg->setSeconds($timestamp->getSeconds());
+ $submsg->setNanos($timestamp->getNanos());
+ } else if ($klass !== "Google\Protobuf\Any") {
+ if (!is_object($value) && !is_array($value)) {
+ throw new GPBDecodeException("Expect message.");
+ }
+
$submsg->mergeFromJsonArray($value);
}
return $submsg;
@@ -1038,22 +1051,28 @@ class Message
*/
public function serializeToJsonStream(&$output)
{
- $output->writeRaw("{", 1);
- $fields = $this->desc->getField();
- $first = true;
- foreach ($fields as $field) {
- if ($this->existField($field)) {
- if ($first) {
- $first = false;
- } else {
- $output->writeRaw(",", 1);
- }
- if (!$this->serializeFieldToJsonStream($output, $field)) {
- return false;
+ if (get_class($this) === 'Google\Protobuf\Timestamp') {
+ $timestamp = GPBUtil::formatTimestamp($this);
+ $timestamp = json_encode($timestamp);
+ $output->writeRaw($timestamp, strlen($timestamp));
+ } else {
+ $output->writeRaw("{", 1);
+ $fields = $this->desc->getField();
+ $first = true;
+ foreach ($fields as $field) {
+ if ($this->existField($field)) {
+ if ($first) {
+ $first = false;
+ } else {
+ $output->writeRaw(",", 1);
+ }
+ if (!$this->serializeFieldToJsonStream($output, $field)) {
+ return false;
+ }
}
}
+ $output->writeRaw("}", 1);
}
- $output->writeRaw("}", 1);
return true;
}
@@ -1341,6 +1360,7 @@ class Message
private function fieldJsonByteSize($field)
{
$size = 0;
+
if ($field->isMap()) {
$getter = $field->getGetter();
$values = $this->$getter();
@@ -1443,21 +1463,26 @@ class Message
public function jsonByteSize()
{
$size = 0;
-
- // Size for "{}".
- $size += 2;
-
- $fields = $this->desc->getField();
- $count = 0;
- foreach ($fields as $field) {
- $field_size = $this->fieldJsonByteSize($field);
- $size += $field_size;
- if ($field_size != 0) {
- $count++;
+ if (get_class($this) === 'Google\Protobuf\Timestamp') {
+ $timestamp = GPBUtil::formatTimestamp($this);
+ $timestamp = json_encode($timestamp);
+ $size += strlen($timestamp);
+ } else {
+ // Size for "{}".
+ $size += 2;
+
+ $fields = $this->desc->getField();
+ $count = 0;
+ foreach ($fields as $field) {
+ $field_size = $this->fieldJsonByteSize($field);
+ $size += $field_size;
+ if ($field_size != 0) {
+ $count++;
+ }
}
+ // size for comma
+ $size += $count > 0 ? ($count - 1) : 0;
}
- // size for comma
- $size += $count > 0 ? ($count - 1) : 0;
return $size;
}
}