Skip to content

Commit

Permalink
Default values should also be serialized for json map key/value (prot…
Browse files Browse the repository at this point in the history
  • Loading branch information
TeBoring committed Jan 28, 2019
1 parent a73b435 commit 3cae8e4
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 4 deletions.
1 change: 0 additions & 1 deletion conformance/failure_list_php_c.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ Required.DurationProtoInputTooLarge.JsonOutput
Required.DurationProtoInputTooSmall.JsonOutput
Required.TimestampProtoInputTooLarge.JsonOutput
Required.TimestampProtoInputTooSmall.JsonOutput
Required.Proto3.JsonInput.BoolMapField.JsonOutput
Required.Proto3.JsonInput.DoubleFieldMaxNegativeValue.JsonOutput
Required.Proto3.JsonInput.DoubleFieldMaxNegativeValue.ProtobufOutput
Required.Proto3.JsonInput.DoubleFieldMinPositiveValue.JsonOutput
Expand Down
5 changes: 2 additions & 3 deletions php/ext/google/protobuf/encode_decode.c
Original file line number Diff line number Diff line change
Expand Up @@ -1163,7 +1163,7 @@ static void put_optional_value(const void* memory, int len,
#define T(upbtypeconst, upbtype, ctype, default_value) \
case upbtypeconst: { \
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_sink_put##upbtype(sink, sel, value); \
} \
Expand All @@ -1181,8 +1181,7 @@ static void put_optional_value(const void* memory, int len,
#undef T
case UPB_TYPE_STRING:
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;
case UPB_TYPE_MESSAGE: {
#if PHP_MAJOR_VERSION < 7
Expand Down
13 changes: 13 additions & 0 deletions php/tests/encode_decode_test.php
Original file line number Diff line number Diff line change
Expand Up @@ -1135,4 +1135,17 @@ public function testDecodeEmptyFieldMask()
$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());
}

}

0 comments on commit 3cae8e4

Please sign in to comment.