Commit 96029f3c authored by Bo Yang's avatar Bo Yang

Convert integer to string if field is string field in json

json_decode automatically convert numeric string to integer, so that
we need to convert it back. However, this will suceed to parse invalid
json data with string field set as integer even though it should have failed.
Because, the failure case is less often than the succeeding case, we decided
to make this change. Users should make sure their data don't use integer for
string fields by themselves.
parent 32339be9
...@@ -13,6 +13,8 @@ Required.Proto3.JsonInput.FloatFieldTooSmall ...@@ -13,6 +13,8 @@ Required.Proto3.JsonInput.FloatFieldTooSmall
Required.Proto3.JsonInput.DoubleFieldTooSmall Required.Proto3.JsonInput.DoubleFieldTooSmall
Required.Proto3.JsonInput.Int32FieldNotInteger Required.Proto3.JsonInput.Int32FieldNotInteger
Required.Proto3.JsonInput.Int64FieldNotInteger Required.Proto3.JsonInput.Int64FieldNotInteger
Required.Proto3.JsonInput.RepeatedFieldWrongElementTypeExpectingStringsGotInt
Required.Proto3.JsonInput.StringFieldNotAString
Required.Proto3.JsonInput.Uint32FieldNotInteger Required.Proto3.JsonInput.Uint32FieldNotInteger
Required.Proto3.JsonInput.Uint64FieldNotInteger Required.Proto3.JsonInput.Uint64FieldNotInteger
Required.Proto3.JsonInput.Int32FieldLeadingSpace Required.Proto3.JsonInput.Int32FieldLeadingSpace
......
...@@ -832,6 +832,9 @@ class Message ...@@ -832,6 +832,9 @@ class Message
if (is_null($value)) { if (is_null($value)) {
return $this->defaultValue($field); return $this->defaultValue($field);
} }
if (is_numeric($value)) {
return strval($value);
}
if (!is_string($value)) { if (!is_string($value)) {
throw new GPBDecodeException( throw new GPBDecodeException(
"String field only accepts string value"); "String field only accepts string value");
......
...@@ -1148,4 +1148,14 @@ class EncodeDecodeTest extends TestBase ...@@ -1148,4 +1148,14 @@ class EncodeDecodeTest extends TestBase
$m->serializeToJsonString()); $m->serializeToJsonString());
} }
public function testJsonDecodeNumericStringMapKey()
{
$m = new TestMessage();
$m->getMapStringString()["1"] = "1";
$data = $m->serializeToJsonString();
$this->assertSame("{\"mapStringString\":{\"1\":\"1\"}}", $data);
$n = new TestMessage();
$n->mergeFromJsonString($data);
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment