Browse Source

Default values should also be serialized for json map key/value (#5643)

Paul Yang 6 years ago
parent
commit
a21caa237a

+ 0 - 1
conformance/failure_list_php_c.txt

@@ -23,7 +23,6 @@ Required.DurationProtoInputTooLarge.JsonOutput
 Required.DurationProtoInputTooSmall.JsonOutput
 Required.DurationProtoInputTooSmall.JsonOutput
 Required.TimestampProtoInputTooLarge.JsonOutput
 Required.TimestampProtoInputTooLarge.JsonOutput
 Required.TimestampProtoInputTooSmall.JsonOutput
 Required.TimestampProtoInputTooSmall.JsonOutput
-Required.Proto3.JsonInput.BoolMapField.JsonOutput
 Required.Proto3.JsonInput.DoubleFieldMaxNegativeValue.JsonOutput
 Required.Proto3.JsonInput.DoubleFieldMaxNegativeValue.JsonOutput
 Required.Proto3.JsonInput.DoubleFieldMaxNegativeValue.ProtobufOutput
 Required.Proto3.JsonInput.DoubleFieldMaxNegativeValue.ProtobufOutput
 Required.Proto3.JsonInput.DoubleFieldMinPositiveValue.JsonOutput
 Required.Proto3.JsonInput.DoubleFieldMinPositiveValue.JsonOutput

+ 2 - 3
php/ext/google/protobuf/encode_decode.c

@@ -1171,7 +1171,7 @@ static void put_optional_value(const void* memory, int len,
 #define T(upbtypeconst, upbtype, ctype, default_value)                         \
 #define T(upbtypeconst, upbtype, ctype, default_value)                         \
   case upbtypeconst: {                                                         \
   case upbtypeconst: {                                                         \
     ctype value = DEREF(memory, 0, ctype);                                     \
     ctype value = DEREF(memory, 0, ctype);                                     \
-    if (value != default_value) {                                              \
+    if (is_json || value != default_value) {                                   \
       upb_selector_t sel = getsel(f, upb_handlers_getprimitivehandlertype(f)); \
       upb_selector_t sel = getsel(f, upb_handlers_getprimitivehandlertype(f)); \
       upb_sink_put##upbtype(sink, sel, value);                                 \
       upb_sink_put##upbtype(sink, sel, value);                                 \
     }                                                                          \
     }                                                                          \
@@ -1189,8 +1189,7 @@ static void put_optional_value(const void* memory, int len,
 #undef T
 #undef T
     case UPB_TYPE_STRING:
     case UPB_TYPE_STRING:
     case UPB_TYPE_BYTES:
     case UPB_TYPE_BYTES:
-      putrawstr(memory, len, f, sink,
-                is_json && is_wrapper_msg(upb_fielddef_containingtype(f)));
+      putrawstr(memory, len, f, sink, is_json);
       break;
       break;
     case UPB_TYPE_MESSAGE: {
     case UPB_TYPE_MESSAGE: {
 #if PHP_MAJOR_VERSION < 7
 #if PHP_MAJOR_VERSION < 7

+ 13 - 0
php/tests/encode_decode_test.php

@@ -1135,4 +1135,17 @@ class EncodeDecodeTest extends TestBase
         $this->assertEquals("", $m->serializeToString());
         $this->assertEquals("", $m->serializeToString());
     }
     }
 
 
+    public function testJsonDecodeMapWithDefaultValueKey()
+    {
+        $m = new TestMessage();
+        $m->getMapInt32Int32()[0] = 0;
+        $this->assertSame("{\"mapInt32Int32\":{\"0\":0}}",
+                          $m->serializeToJsonString());
+
+        $m = new TestMessage();
+        $m->getMapStringString()[""] = "";
+        $this->assertSame("{\"mapStringString\":{\"\":\"\"}}",
+                          $m->serializeToJsonString());
+    }
+
 }
 }