Commit 34a1b6e6 authored by Feng Xiao's avatar Feng Xiao Committed by GitHub

Merge pull request #2394 from cwelton/formatting

oneOf fix for JsonFormat includingDefaultValueFields
parents 46ae90dc 1a56251a
...@@ -49,6 +49,7 @@ import com.google.protobuf.Descriptors.EnumDescriptor; ...@@ -49,6 +49,7 @@ import com.google.protobuf.Descriptors.EnumDescriptor;
import com.google.protobuf.Descriptors.EnumValueDescriptor; import com.google.protobuf.Descriptors.EnumValueDescriptor;
import com.google.protobuf.Descriptors.FieldDescriptor; import com.google.protobuf.Descriptors.FieldDescriptor;
import com.google.protobuf.Descriptors.FileDescriptor; import com.google.protobuf.Descriptors.FileDescriptor;
import com.google.protobuf.Descriptors.OneofDescriptor;
import com.google.protobuf.DoubleValue; import com.google.protobuf.DoubleValue;
import com.google.protobuf.Duration; import com.google.protobuf.Duration;
import com.google.protobuf.DynamicMessage; import com.google.protobuf.DynamicMessage;
...@@ -782,12 +783,18 @@ public class JsonFormat { ...@@ -782,12 +783,18 @@ public class JsonFormat {
if (includingDefaultValueFields) { if (includingDefaultValueFields) {
fieldsToPrint = new TreeMap<FieldDescriptor, Object>(); fieldsToPrint = new TreeMap<FieldDescriptor, Object>();
for (FieldDescriptor field : message.getDescriptorForType().getFields()) { for (FieldDescriptor field : message.getDescriptorForType().getFields()) {
if (field.isOptional() if (field.isOptional()) {
&& field.getJavaType() == FieldDescriptor.JavaType.MESSAGE if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE
&& !message.hasField(field)) { && !message.hasField(field)){
// Always skip empty optional message fields. If not we will recurse indefinitely if // Always skip empty optional message fields. If not we will recurse indefinitely if
// a message has itself as a sub-field. // a message has itself as a sub-field.
continue; continue;
}
OneofDescriptor oneof = field.getContainingOneof();
if (oneof != null && !message.hasField(field)) {
// Skip all oneof fields except the one that is actually set
continue;
}
} }
fieldsToPrint.put(field, message.getField(field)); fieldsToPrint.put(field, message.getField(field));
} }
......
...@@ -1267,6 +1267,23 @@ public class JsonFormatTest extends TestCase { ...@@ -1267,6 +1267,23 @@ public class JsonFormatTest extends TestCase {
+ " }\n" + " }\n"
+ "}", + "}",
JsonFormat.printer().includingDefaultValueFields().print(mapMessage)); JsonFormat.printer().includingDefaultValueFields().print(mapMessage));
TestOneof oneofMessage = TestOneof.getDefaultInstance();
assertEquals("{\n}", JsonFormat.printer().print(oneofMessage));
assertEquals("{\n}", JsonFormat.printer().includingDefaultValueFields().print(oneofMessage));
oneofMessage = TestOneof.newBuilder().setOneofInt32(42).build();
assertEquals("{\n \"oneofInt32\": 42\n}",
JsonFormat.printer().print(oneofMessage));
assertEquals("{\n \"oneofInt32\": 42\n}",
JsonFormat.printer().includingDefaultValueFields().print(oneofMessage));
TestOneof.Builder oneofBuilder = TestOneof.newBuilder();
mergeFromJson("{\n" + " \"oneofNullValue\": null \n" + "}", oneofBuilder);
oneofMessage = oneofBuilder.build();
assertEquals("{\n \"oneofNullValue\": null\n}", JsonFormat.printer().print(oneofMessage));
assertEquals("{\n \"oneofNullValue\": null\n}",
JsonFormat.printer().includingDefaultValueFields().print(oneofMessage));
} }
public void testPreservingProtoFieldNames() throws Exception { public void testPreservingProtoFieldNames() throws Exception {
......
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