|
|
|
@ -773,10 +773,10 @@ class Message |
|
|
|
|
* @return null. |
|
|
|
|
* @throws \Exception Invalid data. |
|
|
|
|
*/ |
|
|
|
|
public function mergeFromJsonString($data) |
|
|
|
|
public function mergeFromJsonString($data, $ignore_unknown = false) |
|
|
|
|
{ |
|
|
|
|
$input = new RawInputStream($data); |
|
|
|
|
$this->parseFromJsonStream($input); |
|
|
|
|
$this->parseFromJsonStream($input, $ignore_unknown); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -801,6 +801,7 @@ class Message |
|
|
|
|
private function convertJsonValueToProtoValue( |
|
|
|
|
$value, |
|
|
|
|
$field, |
|
|
|
|
$ignore_unknown, |
|
|
|
|
$is_map_key = false) |
|
|
|
|
{ |
|
|
|
|
switch ($field->getType()) { |
|
|
|
@ -849,7 +850,7 @@ class Message |
|
|
|
|
} elseif (!is_object($value) && !is_array($value)) { |
|
|
|
|
throw new GPBDecodeException("Expect message."); |
|
|
|
|
} |
|
|
|
|
$submsg->mergeFromJsonArray($value); |
|
|
|
|
$submsg->mergeFromJsonArray($value, $ignore_unknown); |
|
|
|
|
} |
|
|
|
|
return $submsg; |
|
|
|
|
case GPBType::ENUM: |
|
|
|
@ -862,9 +863,12 @@ class Message |
|
|
|
|
$enum_value = $field->getEnumType()->getValueByName($value); |
|
|
|
|
if (!is_null($enum_value)) { |
|
|
|
|
return $enum_value->getNumber(); |
|
|
|
|
} else if ($ignore_unknown) { |
|
|
|
|
return $this->defaultValue($field); |
|
|
|
|
} else { |
|
|
|
|
throw new GPBDecodeException( |
|
|
|
|
"Enum field only accepts integer or enum value name"); |
|
|
|
|
} |
|
|
|
|
throw new GPBDecodeException( |
|
|
|
|
"Enum field only accepts integer or enum value name"); |
|
|
|
|
case GPBType::STRING: |
|
|
|
|
if (is_null($value)) { |
|
|
|
|
return $this->defaultValue($field); |
|
|
|
@ -1125,17 +1129,17 @@ class Message |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected function mergeFromJsonArray($array) |
|
|
|
|
protected function mergeFromJsonArray($array, $ignore_unknown) |
|
|
|
|
{ |
|
|
|
|
if (is_a($this, "Google\Protobuf\Any")) { |
|
|
|
|
$this->clear(); |
|
|
|
|
$this->setTypeUrl($array["@type"]); |
|
|
|
|
$msg = $this->unpack(); |
|
|
|
|
if (GPBUtil::hasSpecialJsonMapping($msg)) { |
|
|
|
|
$msg->mergeFromJsonArray($array["value"]); |
|
|
|
|
$msg->mergeFromJsonArray($array["value"], $ignore_unknown); |
|
|
|
|
} else { |
|
|
|
|
unset($array["@type"]); |
|
|
|
|
$msg->mergeFromJsonArray($array); |
|
|
|
|
$msg->mergeFromJsonArray($array, $ignore_unknown); |
|
|
|
|
} |
|
|
|
|
$this->setValue($msg->serializeToString()); |
|
|
|
|
return; |
|
|
|
@ -1171,7 +1175,7 @@ class Message |
|
|
|
|
$fields = $this->getFields(); |
|
|
|
|
foreach($array as $key => $value) { |
|
|
|
|
$v = new Value(); |
|
|
|
|
$v->mergeFromJsonArray($value); |
|
|
|
|
$v->mergeFromJsonArray($value, $ignore_unknown); |
|
|
|
|
$fields[$key] = $v; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -1194,7 +1198,7 @@ class Message |
|
|
|
|
} |
|
|
|
|
foreach ($array as $key => $v) { |
|
|
|
|
$value = new Value(); |
|
|
|
|
$value->mergeFromJsonArray($v); |
|
|
|
|
$value->mergeFromJsonArray($v, $ignore_unknown); |
|
|
|
|
$values = $struct_value->getFields(); |
|
|
|
|
$values[$key]= $value; |
|
|
|
|
} |
|
|
|
@ -1207,7 +1211,7 @@ class Message |
|
|
|
|
} |
|
|
|
|
foreach ($array as $v) { |
|
|
|
|
$value = new Value(); |
|
|
|
|
$value->mergeFromJsonArray($v); |
|
|
|
|
$value->mergeFromJsonArray($v, $ignore_unknown); |
|
|
|
|
$values = $list_value->getValues(); |
|
|
|
|
$values[]= $value; |
|
|
|
|
} |
|
|
|
@ -1217,10 +1221,10 @@ class Message |
|
|
|
|
} |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
$this->mergeFromArrayJsonImpl($array); |
|
|
|
|
$this->mergeFromArrayJsonImpl($array, $ignore_unknown); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private function mergeFromArrayJsonImpl($array) |
|
|
|
|
private function mergeFromArrayJsonImpl($array, $ignore_unknown) |
|
|
|
|
{ |
|
|
|
|
foreach ($array as $key => $value) { |
|
|
|
|
$field = $this->desc->getFieldByJsonName($key); |
|
|
|
@ -1244,10 +1248,12 @@ class Message |
|
|
|
|
$proto_key = $this->convertJsonValueToProtoValue( |
|
|
|
|
$tmp_key, |
|
|
|
|
$key_field, |
|
|
|
|
$ignore_unknown, |
|
|
|
|
true); |
|
|
|
|
$proto_value = $this->convertJsonValueToProtoValue( |
|
|
|
|
$tmp_value, |
|
|
|
|
$value_field); |
|
|
|
|
$value_field, |
|
|
|
|
$ignore_unknown); |
|
|
|
|
self::kvUpdateHelper($field, $proto_key, $proto_value); |
|
|
|
|
} |
|
|
|
|
} else if ($field->isRepeated()) { |
|
|
|
@ -1261,14 +1267,16 @@ class Message |
|
|
|
|
} |
|
|
|
|
$proto_value = $this->convertJsonValueToProtoValue( |
|
|
|
|
$tmp, |
|
|
|
|
$field); |
|
|
|
|
$field, |
|
|
|
|
$ignore_unknown); |
|
|
|
|
self::appendHelper($field, $proto_value); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
$setter = $field->getSetter(); |
|
|
|
|
$proto_value = $this->convertJsonValueToProtoValue( |
|
|
|
|
$value, |
|
|
|
|
$field); |
|
|
|
|
$field, |
|
|
|
|
$ignore_unknown); |
|
|
|
|
if ($field->getType() === GPBType::MESSAGE) { |
|
|
|
|
if (is_null($proto_value)) { |
|
|
|
|
continue; |
|
|
|
@ -1288,7 +1296,7 @@ class Message |
|
|
|
|
/** |
|
|
|
|
* @ignore |
|
|
|
|
*/ |
|
|
|
|
public function parseFromJsonStream($input) |
|
|
|
|
public function parseFromJsonStream($input, $ignore_unknown) |
|
|
|
|
{ |
|
|
|
|
$array = json_decode($input->getData(), true, 512, JSON_BIGINT_AS_STRING); |
|
|
|
|
if ($this instanceof \Google\Protobuf\ListValue) { |
|
|
|
@ -1304,7 +1312,7 @@ class Message |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
try { |
|
|
|
|
$this->mergeFromJsonArray($array); |
|
|
|
|
$this->mergeFromJsonArray($array, $ignore_unknown); |
|
|
|
|
} catch (\Exception $e) { |
|
|
|
|
throw new GPBDecodeException($e->getMessage()); |
|
|
|
|
} |
|
|
|
|