diff options
author | Ewout <e@ewout.name> | 2018-02-20 16:58:58 +0100 |
---|---|---|
committer | Ewout <e@ewout.name> | 2018-02-20 17:13:21 +0100 |
commit | 7b8f571756792ed2296a766c70af4ddf69082099 (patch) | |
tree | d53cd8664d01d386babc863ff2d2fc62d93a1570 | |
parent | e34ec6077af141dd5dfc1c334ecdcce3c6b51612 (diff) |
Ruby JSON encoding omits zero-length repeated fields by default.
This makes it behave the same way as the other implementations.
It is also nice to always encode an empty message as {}.
-rw-r--r-- | ruby/ext/google/protobuf_c/encode_decode.c | 4 | ||||
-rw-r--r-- | ruby/tests/basic.rb | 4 |
2 files changed, 7 insertions, 1 deletions
diff --git a/ruby/ext/google/protobuf_c/encode_decode.c b/ruby/ext/google/protobuf_c/encode_decode.c index 12080d03..8c6ded64 100644 --- a/ruby/ext/google/protobuf_c/encode_decode.c +++ b/ruby/ext/google/protobuf_c/encode_decode.c @@ -963,13 +963,15 @@ static void putary(VALUE ary, const upb_fielddef *f, upb_sink *sink, if (ary == Qnil) return; + size = NUM2INT(RepeatedField_length(ary)); + if (size == 0 && !emit_defaults) return; + upb_sink_startseq(sink, getsel(f, UPB_HANDLER_STARTSEQ), &subsink); if (upb_fielddef_isprimitive(f)) { sel = getsel(f, upb_handlers_getprimitivehandlertype(f)); } - size = NUM2INT(RepeatedField_length(ary)); for (int i = 0; i < size; i++) { void* memory = RepeatedField_index_native(ary, i); switch (type) { diff --git a/ruby/tests/basic.rb b/ruby/tests/basic.rb index ad34d53d..cadb1380 100644 --- a/ruby/tests/basic.rb +++ b/ruby/tests/basic.rb @@ -1259,6 +1259,10 @@ module BasicTest Foo.encode_json(Foo.new(bar: bar, baz: [baz1, baz2])) end + def test_json_empty + assert TestMessage.encode_json(TestMessage.new) == '{}' + end + def test_json_emit_defaults # TODO: Fix JSON in JRuby version. return if RUBY_PLATFORM == "java" |