diff options
author | Jan Tattermusch <jtattermusch@users.noreply.github.com> | 2015-07-20 09:36:54 -0700 |
---|---|---|
committer | Jan Tattermusch <jtattermusch@users.noreply.github.com> | 2015-07-20 09:36:54 -0700 |
commit | bd3367c8b4c22687fde6c78088242b60f88e5c17 (patch) | |
tree | 410dee597653917b53ff1d7646b92deb5b15ffda /csharp/src/Google.Protobuf/JsonFormatter.cs | |
parent | 3f5df7a74b9d6989d0ea0cb0664f0105d80767eb (diff) | |
parent | c9fd53a3b742f2a34c527cbe0833c5bc081e6ec3 (diff) | |
download | protobuf-bd3367c8b4c22687fde6c78088242b60f88e5c17.tar.gz protobuf-bd3367c8b4c22687fde6c78088242b60f88e5c17.tar.bz2 protobuf-bd3367c8b4c22687fde6c78088242b60f88e5c17.zip |
Merge pull request #624 from jskeet/wkt-json
First part of JSON formatting for well-known types.
Diffstat (limited to 'csharp/src/Google.Protobuf/JsonFormatter.cs')
-rw-r--r-- | csharp/src/Google.Protobuf/JsonFormatter.cs | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/csharp/src/Google.Protobuf/JsonFormatter.cs b/csharp/src/Google.Protobuf/JsonFormatter.cs index dacc7221..a06e6545 100644 --- a/csharp/src/Google.Protobuf/JsonFormatter.cs +++ b/csharp/src/Google.Protobuf/JsonFormatter.cs @@ -35,6 +35,7 @@ using System.Collections; using System.Globalization; using System.Text; using Google.Protobuf.Reflection; +using Google.Protobuf.WellKnownTypes; namespace Google.Protobuf { @@ -121,6 +122,9 @@ namespace Google.Protobuf { ThrowHelper.ThrowIfNull(message, "message"); StringBuilder builder = new StringBuilder(); + // TODO(jonskeet): Handle well-known types here. + // Our reflection support needs improving so that we can get at the descriptor + // to find out whether *this* message is a well-known type. WriteMessage(builder, message); return builder.ToString(); } @@ -375,13 +379,36 @@ namespace Google.Protobuf break; case FieldType.Message: case FieldType.Group: // Never expect to get this, but... - WriteMessage(builder, (IReflectedMessage) value); + if (descriptor.MessageType.IsWellKnownType) + { + WriteWellKnownTypeValue(builder, descriptor, value); + } + else + { + WriteMessage(builder, (IReflectedMessage) value); + } break; default: throw new ArgumentException("Invalid field type: " + descriptor.FieldType); } } + /// <summary> + /// Central interception point for well-known type formatting. Any well-known types which + /// don't need special handling can fall back to WriteMessage. + /// </summary> + private void WriteWellKnownTypeValue(StringBuilder builder, FieldDescriptor descriptor, object value) + { + // For wrapper types, the value will be the (possibly boxed) "native" value, + // so we can write it as if we were unconditionally writing the Value field for the wrapper type. + if (descriptor.MessageType.File == Int32Value.Descriptor.File && value != null) + { + WriteSingleValue(builder, descriptor.MessageType.FindFieldByNumber(1), value); + return; + } + WriteMessage(builder, (IReflectedMessage) value); + } + private void WriteList(StringBuilder builder, IFieldAccessor accessor, IList list) { builder.Append("[ "); |