Browse Source

DefaultValueObjectWriter should populate oneof message field

Jie Luo 8 years ago
parent
commit
d59592af61

+ 3 - 2
src/google/protobuf/util/internal/default_value_objectwriter.cc

@@ -363,8 +363,9 @@ void DefaultValueObjectWriter::Node::PopulateChildren(
     }
 
     // If oneof_index() != 0, the child field is part of a "oneof", which means
-    // the child field is optional and we shouldn't populate its default value.
-    if (field.oneof_index() != 0) continue;
+    // the child field is optional and we shouldn't populate its default
+    // primitive value.
+    if (field.oneof_index() != 0 && kind == PRIMITIVE) continue;
 
     // If the child field is of primitive type, sets its data to the default
     // value of its type.

+ 16 - 0
src/google/protobuf/util/json_util_test.cc

@@ -51,6 +51,7 @@ using proto3::FOO;
 using proto3::BAR;
 using proto3::TestMessage;
 using proto3::TestMap;
+using proto3::TestOneof;
 using testing::MapIn;
 
 static const char kTypeUrlPrefix[] = "type.googleapis.com";
@@ -232,6 +233,21 @@ TEST_F(JsonUtilTest, ParsePrimitiveMapIn) {
   EXPECT_EQ(message.DebugString(), other.DebugString());
 }
 
+TEST_F(JsonUtilTest, PrintPrimitiveOneof) {
+  TestOneof message;
+  JsonPrintOptions options;
+  options.always_print_primitive_fields = true;
+  message.mutable_oneof_message_value();
+  EXPECT_EQ(
+      "{\"oneofMessageValue\":{\"value\":0}}",
+      ToJson(message, options));
+
+  message.set_oneof_int32_value(1);
+  EXPECT_EQ(
+      "{\"oneofInt32Value\":1}",
+      ToJson(message, options));
+}
+
 TEST_F(JsonUtilTest, TestParseIgnoreUnknownFields) {
   TestMessage m;
   JsonParseOptions options;