Przeglądaj źródła

jsonpb: Marshal Any according to the spec.

Unmarshaling Any is a TODO.

Fixes #170.
David Symonds 9 lat temu
rodzic
commit
bf531ff1a0

+ 84 - 6
jsonpb/jsonpb.go

@@ -79,7 +79,7 @@ type Marshaler struct {
 // Marshal marshals a protocol buffer into JSON.
 // Marshal marshals a protocol buffer into JSON.
 func (m *Marshaler) Marshal(out io.Writer, pb proto.Message) error {
 func (m *Marshaler) Marshal(out io.Writer, pb proto.Message) error {
 	writer := &errWriter{writer: out}
 	writer := &errWriter{writer: out}
-	return m.marshalObject(writer, pb, "")
+	return m.marshalObject(writer, pb, "", "")
 }
 }
 
 
 // MarshalToString converts a protocol buffer object to JSON string.
 // MarshalToString converts a protocol buffer object to JSON string.
@@ -98,14 +98,15 @@ func (s int32Slice) Len() int           { return len(s) }
 func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] }
 func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] }
 func (s int32Slice) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
 func (s int32Slice) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
 
 
+type wkt interface {
+	XXX_WellKnownType() string
+}
+
 // marshalObject writes a struct to the Writer.
 // marshalObject writes a struct to the Writer.
-func (m *Marshaler) marshalObject(out *errWriter, v proto.Message, indent string) error {
+func (m *Marshaler) marshalObject(out *errWriter, v proto.Message, indent, typeURL string) error {
 	s := reflect.ValueOf(v).Elem()
 	s := reflect.ValueOf(v).Elem()
 
 
 	// Handle well-known types.
 	// Handle well-known types.
-	type wkt interface {
-		XXX_WellKnownType() string
-	}
 	if wkt, ok := v.(wkt); ok {
 	if wkt, ok := v.(wkt); ok {
 		switch wkt.XXX_WellKnownType() {
 		switch wkt.XXX_WellKnownType() {
 		case "DoubleValue", "FloatValue", "Int64Value", "UInt64Value",
 		case "DoubleValue", "FloatValue", "Int64Value", "UInt64Value",
@@ -114,6 +115,9 @@ func (m *Marshaler) marshalObject(out *errWriter, v proto.Message, indent string
 			//  as the wrapped primitive type, ..."
 			//  as the wrapped primitive type, ..."
 			sprop := proto.GetProperties(s.Type())
 			sprop := proto.GetProperties(s.Type())
 			return m.marshalValue(out, sprop.Prop[0], s.Field(0), indent)
 			return m.marshalValue(out, sprop.Prop[0], s.Field(0), indent)
+		case "Any":
+			// Any is a bit more involved.
+			return m.marshalAny(out, v, indent)
 		case "Duration":
 		case "Duration":
 			// "Generated output always contains 3, 6, or 9 fractional digits,
 			// "Generated output always contains 3, 6, or 9 fractional digits,
 			//  depending on required precision."
 			//  depending on required precision."
@@ -163,6 +167,14 @@ func (m *Marshaler) marshalObject(out *errWriter, v proto.Message, indent string
 	}
 	}
 
 
 	firstField := true
 	firstField := true
+
+	if typeURL != "" {
+		if err := m.marshalTypeURL(out, indent, typeURL); err != nil {
+			return err
+		}
+		firstField = false
+	}
+
 	for i := 0; i < s.NumField(); i++ {
 	for i := 0; i < s.NumField(); i++ {
 		value := s.Field(i)
 		value := s.Field(i)
 		valueField := s.Type().Field(i)
 		valueField := s.Type().Field(i)
@@ -271,6 +283,70 @@ func (m *Marshaler) writeSep(out *errWriter) {
 	}
 	}
 }
 }
 
 
+func (m *Marshaler) marshalAny(out *errWriter, any proto.Message, indent string) error {
+	// "If the Any contains a value that has a special JSON mapping,
+	//  it will be converted as follows: {"@type": xxx, "value": yyy}.
+	//  Otherwise, the value will be converted into a JSON object,
+	//  and the "@type" field will be inserted to indicate the actual data type."
+	v := reflect.ValueOf(any).Elem()
+	turl := v.Field(0).String()
+	val := v.Field(1).Bytes()
+
+	// Only the part of type_url after the last slash is relevant.
+	mname := turl
+	if slash := strings.LastIndex(mname, "/"); slash >= 0 {
+		mname = mname[slash+1:]
+	}
+	mt := proto.MessageType(mname)
+	if mt == nil {
+		return fmt.Errorf("unknown message type %q", mname)
+	}
+	msg := reflect.New(mt.Elem()).Interface().(proto.Message)
+	if err := proto.Unmarshal(val, msg); err != nil {
+		return err
+	}
+
+	if _, ok := msg.(wkt); ok {
+		out.write("{")
+		if m.Indent != "" {
+			out.write("\n")
+		}
+		if err := m.marshalTypeURL(out, indent, turl); err != nil {
+			return err
+		}
+		m.writeSep(out)
+		out.write(`"value":`)
+		if err := m.marshalObject(out, msg, indent, ""); err != nil {
+			return err
+		}
+		if m.Indent != "" {
+			out.write("\n")
+			out.write(indent)
+		}
+		out.write("}")
+		return out.err
+	}
+
+	return m.marshalObject(out, msg, indent, turl)
+}
+
+func (m *Marshaler) marshalTypeURL(out *errWriter, indent, typeURL string) error {
+	if m.Indent != "" {
+		out.write(indent)
+		out.write(m.Indent)
+	}
+	out.write(`"@type":`)
+	if m.Indent != "" {
+		out.write(" ")
+	}
+	b, err := json.Marshal(typeURL)
+	if err != nil {
+		return err
+	}
+	out.write(string(b))
+	return out.err
+}
+
 // marshalField writes field description and value to the Writer.
 // marshalField writes field description and value to the Writer.
 func (m *Marshaler) marshalField(out *errWriter, prop *proto.Properties, v reflect.Value, indent string) error {
 func (m *Marshaler) marshalField(out *errWriter, prop *proto.Properties, v reflect.Value, indent string) error {
 	if m.Indent != "" {
 	if m.Indent != "" {
@@ -358,7 +434,7 @@ func (m *Marshaler) marshalValue(out *errWriter, prop *proto.Properties, v refle
 
 
 	// Handle nested messages.
 	// Handle nested messages.
 	if v.Kind() == reflect.Struct {
 	if v.Kind() == reflect.Struct {
-		return m.marshalObject(out, v.Addr().Interface().(proto.Message), indent+m.Indent)
+		return m.marshalObject(out, v.Addr().Interface().(proto.Message), indent+m.Indent, "")
 	}
 	}
 
 
 	// Handle maps.
 	// Handle maps.
@@ -478,6 +554,8 @@ func unmarshalValue(target reflect.Value, inputValue json.RawMessage, prop *prot
 			// encoding/json will turn JSON `null` into Go `nil`,
 			// encoding/json will turn JSON `null` into Go `nil`,
 			// so we don't have to do any extra work.
 			// so we don't have to do any extra work.
 			return unmarshalValue(target.Field(0), inputValue, prop)
 			return unmarshalValue(target.Field(0), inputValue, prop)
+		case "Any":
+			return fmt.Errorf("unmarshaling Any not supported yet")
 		case "Duration":
 		case "Duration":
 			unq, err := strconv.Unquote(string(inputValue))
 			unq, err := strconv.Unquote(string(inputValue))
 			if err != nil {
 			if err != nil {

+ 16 - 0
jsonpb/jsonpb_test.go

@@ -42,6 +42,7 @@ import (
 
 
 	pb "github.com/golang/protobuf/jsonpb/jsonpb_test_proto"
 	pb "github.com/golang/protobuf/jsonpb/jsonpb_test_proto"
 	proto3pb "github.com/golang/protobuf/proto/proto3_proto"
 	proto3pb "github.com/golang/protobuf/proto/proto3_proto"
+	anypb "github.com/golang/protobuf/ptypes/any"
 	durpb "github.com/golang/protobuf/ptypes/duration"
 	durpb "github.com/golang/protobuf/ptypes/duration"
 	stpb "github.com/golang/protobuf/ptypes/struct"
 	stpb "github.com/golang/protobuf/ptypes/struct"
 	tspb "github.com/golang/protobuf/ptypes/timestamp"
 	tspb "github.com/golang/protobuf/ptypes/timestamp"
@@ -339,6 +340,21 @@ var marshalingTests = []struct {
 		`{"o_int32":4}`},
 		`{"o_int32":4}`},
 	{"proto2 extension", marshaler, realNumber, realNumberJSON},
 	{"proto2 extension", marshaler, realNumber, realNumberJSON},
 
 
+	{"Any with message", marshaler, &pb.KnownTypes{An: &anypb.Any{
+		TypeUrl: "something.example.com/jsonpb.Simple",
+		Value: []byte{
+			// &pb.Simple{OBool:true}
+			1 << 3, 1,
+		},
+	}}, `{"an":{"@type":"something.example.com/jsonpb.Simple","oBool":true}}`},
+	{"Any with WKT", marshaler, &pb.KnownTypes{An: &anypb.Any{
+		TypeUrl: "type.googleapis.com/google.protobuf.Duration",
+		Value: []byte{
+			// &durpb.Duration{Seconds: 1, Nanos: 212000000 }
+			1 << 3, 1, // seconds
+			2 << 3, 0x80, 0xba, 0x8b, 0x65, // nanos
+		},
+	}}, `{"an":{"@type":"type.googleapis.com/google.protobuf.Duration","value":"1.212s"}}`},
 	{"Duration", marshaler, &pb.KnownTypes{Dur: &durpb.Duration{Seconds: 3}}, `{"dur":"3.000s"}`},
 	{"Duration", marshaler, &pb.KnownTypes{Dur: &durpb.Duration{Seconds: 3}}, `{"dur":"3.000s"}`},
 	{"Struct", marshaler, &pb.KnownTypes{St: &stpb.Struct{
 	{"Struct", marshaler, &pb.KnownTypes{St: &stpb.Struct{
 		Fields: map[string]*stpb.Value{
 		Fields: map[string]*stpb.Value{

+ 1 - 1
jsonpb/jsonpb_test_proto/Makefile

@@ -30,4 +30,4 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
 regenerate:
 regenerate:
-	protoc --go_out=Mgoogle/protobuf/duration.proto=github.com/golang/protobuf/ptypes/duration,Mgoogle/protobuf/struct.proto=github.com/golang/protobuf/ptypes/struct,Mgoogle/protobuf/timestamp.proto=github.com/golang/protobuf/ptypes/timestamp,Mgoogle/protobuf/wrappers.proto=github.com/golang/protobuf/ptypes/wrappers:. *.proto
+	protoc --go_out=Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any,Mgoogle/protobuf/duration.proto=github.com/golang/protobuf/ptypes/duration,Mgoogle/protobuf/struct.proto=github.com/golang/protobuf/ptypes/struct,Mgoogle/protobuf/timestamp.proto=github.com/golang/protobuf/ptypes/timestamp,Mgoogle/protobuf/wrappers.proto=github.com/golang/protobuf/ptypes/wrappers:. *.proto

+ 102 - 91
jsonpb/jsonpb_test_proto/test_objects.pb.go

@@ -7,10 +7,11 @@ package jsonpb
 import proto "github.com/golang/protobuf/proto"
 import proto "github.com/golang/protobuf/proto"
 import fmt "fmt"
 import fmt "fmt"
 import math "math"
 import math "math"
-import google_protobuf "github.com/golang/protobuf/ptypes/duration"
-import google_protobuf1 "github.com/golang/protobuf/ptypes/struct"
-import google_protobuf2 "github.com/golang/protobuf/ptypes/timestamp"
-import google_protobuf3 "github.com/golang/protobuf/ptypes/wrappers"
+import google_protobuf "github.com/golang/protobuf/ptypes/any"
+import google_protobuf1 "github.com/golang/protobuf/ptypes/duration"
+import google_protobuf2 "github.com/golang/protobuf/ptypes/struct"
+import google_protobuf3 "github.com/golang/protobuf/ptypes/timestamp"
+import google_protobuf4 "github.com/golang/protobuf/ptypes/wrappers"
 
 
 // Reference imports to suppress errors if they are not otherwise used.
 // Reference imports to suppress errors if they are not otherwise used.
 var _ = proto.Marshal
 var _ = proto.Marshal
@@ -546,18 +547,19 @@ var E_Complex_RealExtension = &proto.ExtensionDesc{
 }
 }
 
 
 type KnownTypes struct {
 type KnownTypes struct {
-	Dur              *google_protobuf.Duration     `protobuf:"bytes,1,opt,name=dur" json:"dur,omitempty"`
-	St               *google_protobuf1.Struct      `protobuf:"bytes,12,opt,name=st" json:"st,omitempty"`
-	Ts               *google_protobuf2.Timestamp   `protobuf:"bytes,2,opt,name=ts" json:"ts,omitempty"`
-	Dbl              *google_protobuf3.DoubleValue `protobuf:"bytes,3,opt,name=dbl" json:"dbl,omitempty"`
-	Flt              *google_protobuf3.FloatValue  `protobuf:"bytes,4,opt,name=flt" json:"flt,omitempty"`
-	I64              *google_protobuf3.Int64Value  `protobuf:"bytes,5,opt,name=i64" json:"i64,omitempty"`
-	U64              *google_protobuf3.UInt64Value `protobuf:"bytes,6,opt,name=u64" json:"u64,omitempty"`
-	I32              *google_protobuf3.Int32Value  `protobuf:"bytes,7,opt,name=i32" json:"i32,omitempty"`
-	U32              *google_protobuf3.UInt32Value `protobuf:"bytes,8,opt,name=u32" json:"u32,omitempty"`
-	Bool             *google_protobuf3.BoolValue   `protobuf:"bytes,9,opt,name=bool" json:"bool,omitempty"`
-	Str              *google_protobuf3.StringValue `protobuf:"bytes,10,opt,name=str" json:"str,omitempty"`
-	Bytes            *google_protobuf3.BytesValue  `protobuf:"bytes,11,opt,name=bytes" json:"bytes,omitempty"`
+	An               *google_protobuf.Any          `protobuf:"bytes,14,opt,name=an" json:"an,omitempty"`
+	Dur              *google_protobuf1.Duration    `protobuf:"bytes,1,opt,name=dur" json:"dur,omitempty"`
+	St               *google_protobuf2.Struct      `protobuf:"bytes,12,opt,name=st" json:"st,omitempty"`
+	Ts               *google_protobuf3.Timestamp   `protobuf:"bytes,2,opt,name=ts" json:"ts,omitempty"`
+	Dbl              *google_protobuf4.DoubleValue `protobuf:"bytes,3,opt,name=dbl" json:"dbl,omitempty"`
+	Flt              *google_protobuf4.FloatValue  `protobuf:"bytes,4,opt,name=flt" json:"flt,omitempty"`
+	I64              *google_protobuf4.Int64Value  `protobuf:"bytes,5,opt,name=i64" json:"i64,omitempty"`
+	U64              *google_protobuf4.UInt64Value `protobuf:"bytes,6,opt,name=u64" json:"u64,omitempty"`
+	I32              *google_protobuf4.Int32Value  `protobuf:"bytes,7,opt,name=i32" json:"i32,omitempty"`
+	U32              *google_protobuf4.UInt32Value `protobuf:"bytes,8,opt,name=u32" json:"u32,omitempty"`
+	Bool             *google_protobuf4.BoolValue   `protobuf:"bytes,9,opt,name=bool" json:"bool,omitempty"`
+	Str              *google_protobuf4.StringValue `protobuf:"bytes,10,opt,name=str" json:"str,omitempty"`
+	Bytes            *google_protobuf4.BytesValue  `protobuf:"bytes,11,opt,name=bytes" json:"bytes,omitempty"`
 	XXX_unrecognized []byte                        `json:"-"`
 	XXX_unrecognized []byte                        `json:"-"`
 }
 }
 
 
@@ -566,84 +568,91 @@ func (m *KnownTypes) String() string            { return proto.CompactTextString
 func (*KnownTypes) ProtoMessage()               {}
 func (*KnownTypes) ProtoMessage()               {}
 func (*KnownTypes) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{7} }
 func (*KnownTypes) Descriptor() ([]byte, []int) { return fileDescriptor1, []int{7} }
 
 
-func (m *KnownTypes) GetDur() *google_protobuf.Duration {
+func (m *KnownTypes) GetAn() *google_protobuf.Any {
+	if m != nil {
+		return m.An
+	}
+	return nil
+}
+
+func (m *KnownTypes) GetDur() *google_protobuf1.Duration {
 	if m != nil {
 	if m != nil {
 		return m.Dur
 		return m.Dur
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
-func (m *KnownTypes) GetSt() *google_protobuf1.Struct {
+func (m *KnownTypes) GetSt() *google_protobuf2.Struct {
 	if m != nil {
 	if m != nil {
 		return m.St
 		return m.St
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
-func (m *KnownTypes) GetTs() *google_protobuf2.Timestamp {
+func (m *KnownTypes) GetTs() *google_protobuf3.Timestamp {
 	if m != nil {
 	if m != nil {
 		return m.Ts
 		return m.Ts
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
-func (m *KnownTypes) GetDbl() *google_protobuf3.DoubleValue {
+func (m *KnownTypes) GetDbl() *google_protobuf4.DoubleValue {
 	if m != nil {
 	if m != nil {
 		return m.Dbl
 		return m.Dbl
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
-func (m *KnownTypes) GetFlt() *google_protobuf3.FloatValue {
+func (m *KnownTypes) GetFlt() *google_protobuf4.FloatValue {
 	if m != nil {
 	if m != nil {
 		return m.Flt
 		return m.Flt
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
-func (m *KnownTypes) GetI64() *google_protobuf3.Int64Value {
+func (m *KnownTypes) GetI64() *google_protobuf4.Int64Value {
 	if m != nil {
 	if m != nil {
 		return m.I64
 		return m.I64
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
-func (m *KnownTypes) GetU64() *google_protobuf3.UInt64Value {
+func (m *KnownTypes) GetU64() *google_protobuf4.UInt64Value {
 	if m != nil {
 	if m != nil {
 		return m.U64
 		return m.U64
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
-func (m *KnownTypes) GetI32() *google_protobuf3.Int32Value {
+func (m *KnownTypes) GetI32() *google_protobuf4.Int32Value {
 	if m != nil {
 	if m != nil {
 		return m.I32
 		return m.I32
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
-func (m *KnownTypes) GetU32() *google_protobuf3.UInt32Value {
+func (m *KnownTypes) GetU32() *google_protobuf4.UInt32Value {
 	if m != nil {
 	if m != nil {
 		return m.U32
 		return m.U32
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
-func (m *KnownTypes) GetBool() *google_protobuf3.BoolValue {
+func (m *KnownTypes) GetBool() *google_protobuf4.BoolValue {
 	if m != nil {
 	if m != nil {
 		return m.Bool
 		return m.Bool
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
-func (m *KnownTypes) GetStr() *google_protobuf3.StringValue {
+func (m *KnownTypes) GetStr() *google_protobuf4.StringValue {
 	if m != nil {
 	if m != nil {
 		return m.Str
 		return m.Str
 	}
 	}
 	return nil
 	return nil
 }
 }
 
 
-func (m *KnownTypes) GetBytes() *google_protobuf3.BytesValue {
+func (m *KnownTypes) GetBytes() *google_protobuf4.BytesValue {
 	if m != nil {
 	if m != nil {
 		return m.Bytes
 		return m.Bytes
 	}
 	}
@@ -673,68 +682,70 @@ func init() {
 }
 }
 
 
 var fileDescriptor1 = []byte{
 var fileDescriptor1 = []byte{
-	// 1008 bytes of a gzipped FileDescriptorProto
+	// 1031 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x95, 0xdf, 0x72, 0xdb, 0x44,
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x95, 0xdf, 0x72, 0xdb, 0x44,
-	0x14, 0xc6, 0x2b, 0xad, 0x25, 0xd9, 0xeb, 0x24, 0x98, 0x9d, 0x94, 0xaa, 0x26, 0x80, 0xc6, 0x03,
-	0x45, 0x14, 0xea, 0x0e, 0x8a, 0xc7, 0xc3, 0x14, 0x6e, 0x48, 0x63, 0x28, 0x03, 0x29, 0x33, 0xeb,
-	0x86, 0x5e, 0x7a, 0xe4, 0x78, 0x6d, 0x54, 0x64, 0xad, 0x67, 0x77, 0x45, 0xea, 0x81, 0x8b, 0x3c,
-	0x04, 0xaf, 0x00, 0x8f, 0xc0, 0x25, 0xcf, 0xc6, 0x9c, 0x5d, 0xfd, 0x71, 0xec, 0xf8, 0x2a, 0x3e,
-	0x3a, 0xdf, 0xf9, 0xb2, 0xfa, 0xed, 0xd1, 0x39, 0x98, 0x28, 0x26, 0xd5, 0x84, 0x4f, 0xdf, 0xb0,
-	0x2b, 0x25, 0xfb, 0x2b, 0xc1, 0x15, 0x27, 0xee, 0x1b, 0xc9, 0xb3, 0xd5, 0xb4, 0xfb, 0xe1, 0x82,
-	0xf3, 0x45, 0xca, 0x9e, 0xea, 0xa7, 0xd3, 0x7c, 0xfe, 0x74, 0x96, 0x8b, 0x58, 0x25, 0x3c, 0x33,
-	0xba, 0xee, 0xc9, 0x76, 0x5e, 0x2a, 0x91, 0x5f, 0xa9, 0x22, 0xfb, 0xd1, 0x76, 0x56, 0x25, 0x4b,
-	0x26, 0x55, 0xbc, 0x5c, 0x15, 0x82, 0x1d, 0xfb, 0x6b, 0x11, 0xaf, 0x56, 0x4c, 0x14, 0xc7, 0xe8,
-	0xfd, 0x6d, 0x63, 0x77, 0x9c, 0x2c, 0x57, 0x29, 0x23, 0xf7, 0xb1, 0xcb, 0x27, 0x53, 0xce, 0x53,
-	0xdf, 0x0a, 0xac, 0xb0, 0x49, 0x1d, 0x7e, 0xc6, 0x79, 0x4a, 0x1e, 0x60, 0x8f, 0x4f, 0x92, 0x4c,
-	0x9d, 0x46, 0xbe, 0x1d, 0x58, 0xa1, 0x43, 0x5d, 0xfe, 0x03, 0x44, 0x55, 0x62, 0x38, 0xf0, 0x51,
-	0x60, 0x85, 0xc8, 0x24, 0x86, 0x03, 0xf2, 0x10, 0x37, 0xf9, 0x24, 0x37, 0x25, 0x8d, 0xc0, 0x0a,
-	0x0f, 0xa9, 0xc7, 0x2f, 0x75, 0x58, 0xa7, 0x86, 0x03, 0xdf, 0x09, 0xac, 0xb0, 0x51, 0xa4, 0xca,
-	0x2a, 0x69, 0xaa, 0xdc, 0xc0, 0x0a, 0xdf, 0xa5, 0x1e, 0x1f, 0x6f, 0x54, 0x49, 0x53, 0xe5, 0x05,
-	0x56, 0x48, 0x8a, 0xd4, 0x70, 0x60, 0x0e, 0x31, 0x4f, 0x79, 0xac, 0xfc, 0x66, 0x60, 0x85, 0x36,
-	0x75, 0xf9, 0x77, 0x10, 0x99, 0x9a, 0x19, 0xcf, 0xa7, 0x29, 0xf3, 0x5b, 0x81, 0x15, 0x5a, 0xd4,
-	0xe3, 0xe7, 0x3a, 0x2c, 0xec, 0x94, 0x48, 0xb2, 0x85, 0x8f, 0x03, 0x2b, 0x6c, 0x81, 0x9d, 0x0e,
-	0x8d, 0xdd, 0x74, 0xad, 0x98, 0xf4, 0xdb, 0x81, 0x15, 0x1e, 0x50, 0x97, 0x9f, 0x41, 0xd4, 0xfb,
-	0xc7, 0xc6, 0x1e, 0x65, 0x2b, 0x16, 0x2b, 0x09, 0xa0, 0x44, 0x09, 0x0a, 0x01, 0x28, 0x51, 0x82,
-	0x12, 0x15, 0x28, 0x04, 0xa0, 0x44, 0x05, 0x4a, 0x54, 0xa0, 0x10, 0x80, 0x12, 0x15, 0x28, 0x51,
-	0x83, 0x42, 0x00, 0x4a, 0xd4, 0xa0, 0x44, 0x0d, 0x0a, 0x01, 0x28, 0x51, 0x83, 0x12, 0x35, 0x28,
-	0x04, 0xa0, 0xc4, 0x78, 0xa3, 0xaa, 0x02, 0x85, 0x00, 0x94, 0xa8, 0x41, 0x89, 0x0a, 0x14, 0x02,
-	0x50, 0xa2, 0x02, 0x25, 0x6a, 0x50, 0x08, 0x40, 0x89, 0x1a, 0x94, 0xa8, 0x41, 0x21, 0x00, 0x25,
-	0x6a, 0x50, 0xa2, 0x02, 0x85, 0x00, 0x94, 0x30, 0xa0, 0xfe, 0xb5, 0xb1, 0xfb, 0x3a, 0x99, 0x2d,
-	0x98, 0x22, 0x8f, 0xb1, 0x73, 0xc5, 0x53, 0x2e, 0x74, 0x3f, 0x1d, 0x45, 0xc7, 0x7d, 0xd3, 0xf2,
-	0x7d, 0x93, 0xee, 0x3f, 0x87, 0x1c, 0x35, 0x12, 0xf2, 0x04, 0xfc, 0x8c, 0x1a, 0xe0, 0xed, 0x53,
-	0xbb, 0x42, 0xff, 0x25, 0x8f, 0xb0, 0x2b, 0x75, 0xd7, 0xea, 0x0b, 0x6c, 0x47, 0x47, 0xa5, 0xda,
-	0xf4, 0x32, 0x2d, 0xb2, 0xe4, 0x33, 0x03, 0x44, 0x2b, 0xe1, 0x9c, 0xbb, 0x4a, 0x00, 0x54, 0x48,
-	0x3d, 0x61, 0x2e, 0xd8, 0x3f, 0xd6, 0x9e, 0xef, 0x94, 0xca, 0xe2, 0xde, 0x69, 0x99, 0x27, 0x5f,
-	0xe0, 0x96, 0x98, 0x94, 0xe2, 0xfb, 0xda, 0x76, 0x47, 0xdc, 0x14, 0xc5, 0xaf, 0xde, 0x27, 0xd8,
-	0x31, 0x87, 0xf6, 0x30, 0xa2, 0xa3, 0xf3, 0xce, 0x3d, 0xd2, 0xc2, 0xce, 0xf7, 0x74, 0x34, 0x7a,
-	0xd9, 0xb1, 0x48, 0x13, 0x37, 0xce, 0x7e, 0xba, 0x1c, 0x75, 0xec, 0xde, 0x5f, 0x36, 0x6e, 0x5c,
-	0xc4, 0x2b, 0x49, 0xbe, 0xc6, 0xed, 0xa5, 0x69, 0x17, 0x60, 0xaf, 0x7b, 0xac, 0x1d, 0xbd, 0x5f,
-	0xfa, 0x83, 0xa4, 0x7f, 0xa1, 0xfb, 0x67, 0xac, 0xc4, 0x28, 0x53, 0x62, 0x4d, 0x5b, 0xcb, 0x32,
-	0x26, 0xdf, 0xe2, 0xc3, 0xa5, 0xee, 0xcd, 0xf2, 0xad, 0x6d, 0x5d, 0xfe, 0xc1, 0xed, 0x72, 0xe8,
-	0x57, 0xf3, 0xda, 0xc6, 0xa0, 0xbd, 0xac, 0x9f, 0x74, 0xbf, 0xc1, 0x47, 0xb7, 0xfd, 0x49, 0x07,
-	0xa3, 0xdf, 0xd8, 0x5a, 0x5f, 0x23, 0xa2, 0xf0, 0x93, 0x1c, 0x63, 0xe7, 0xf7, 0x38, 0xcd, 0x99,
-	0x1e, 0x09, 0x2d, 0x6a, 0x82, 0x67, 0xf6, 0x57, 0x56, 0xf7, 0x25, 0xee, 0x6c, 0xdb, 0x6f, 0xd6,
-	0x37, 0x4d, 0xfd, 0xc7, 0x9b, 0xf5, 0xbb, 0x97, 0x52, 0xfb, 0xf5, 0x18, 0x3e, 0xb8, 0x90, 0x8b,
-	0xd7, 0x89, 0xfa, 0xf5, 0xe7, 0x8c, 0xf1, 0x39, 0x79, 0x0f, 0x3b, 0x2a, 0x51, 0x29, 0xd3, 0x6e,
-	0xad, 0x17, 0xf7, 0xa8, 0x09, 0x89, 0x8f, 0x5d, 0x19, 0xa7, 0xb1, 0x58, 0x6b, 0x4b, 0xf4, 0xe2,
-	0x1e, 0x2d, 0x62, 0xd2, 0xc5, 0xde, 0x73, 0x9e, 0xc3, 0x41, 0xf4, 0x9c, 0x82, 0x1a, 0xef, 0xca,
-	0x3c, 0x38, 0xf3, 0xb0, 0x93, 0x67, 0x09, 0xcf, 0x7a, 0x8f, 0x70, 0x83, 0xb2, 0x38, 0xad, 0x5f,
-	0xcc, 0xd2, 0x33, 0xc3, 0x04, 0x8f, 0x9b, 0xcd, 0x59, 0xe7, 0xe6, 0xe6, 0xe6, 0xc6, 0xee, 0x5d,
-	0x83, 0x19, 0x9c, 0xf1, 0x2d, 0x39, 0xc1, 0xad, 0x64, 0x19, 0x2f, 0x92, 0x0c, 0xfe, 0xa9, 0x91,
-	0xd7, 0x0f, 0xea, 0x92, 0xe8, 0x1c, 0x1f, 0x09, 0x16, 0xa7, 0x13, 0xf6, 0x56, 0xb1, 0x4c, 0x26,
-	0x3c, 0x23, 0x07, 0x75, 0xb3, 0xc4, 0xa9, 0xff, 0xc7, 0xed, 0x6e, 0x2b, 0xec, 0xe9, 0x21, 0x14,
-	0x8d, 0xca, 0x9a, 0xde, 0x7f, 0x0d, 0x8c, 0x7f, 0xcc, 0xf8, 0x75, 0xf6, 0x6a, 0xbd, 0x62, 0x92,
-	0x7c, 0x8e, 0xd1, 0x2c, 0x37, 0x5f, 0x56, 0x3b, 0x7a, 0xd8, 0x37, 0x53, 0xbe, 0x5f, 0x4e, 0xf9,
-	0xfe, 0x79, 0xb1, 0x44, 0x28, 0xa8, 0xc8, 0xa7, 0xd8, 0x96, 0xca, 0x3f, 0xd0, 0xda, 0x07, 0x3b,
-	0xda, 0xb1, 0x5e, 0x28, 0xd4, 0x96, 0xf0, 0xc5, 0xda, 0x4a, 0x16, 0x77, 0xd2, 0xdd, 0x11, 0xbe,
-	0x2a, 0x77, 0x0b, 0xb5, 0x95, 0x24, 0x7d, 0x8c, 0x66, 0xd3, 0x54, 0x23, 0x6d, 0x47, 0x27, 0xbb,
-	0x27, 0xd0, 0x23, 0xe4, 0x17, 0xc0, 0x47, 0x41, 0x48, 0x9e, 0x60, 0x34, 0x4f, 0x95, 0x5e, 0x08,
-	0xd0, 0xce, 0xdb, 0x7a, 0x3d, 0x8c, 0x0a, 0xf9, 0x3c, 0x55, 0x20, 0x4f, 0x8a, 0x25, 0x71, 0x97,
-	0x5c, 0x37, 0x68, 0x21, 0x4f, 0x86, 0x03, 0x38, 0x4d, 0x3e, 0x1c, 0xe8, 0xc5, 0x71, 0xd7, 0x69,
-	0x2e, 0x37, 0xf5, 0xf9, 0x70, 0xa0, 0xed, 0x4f, 0x23, 0xbd, 0x4d, 0xf6, 0xd8, 0x9f, 0x46, 0xa5,
-	0xfd, 0x69, 0xa4, 0xed, 0x4f, 0x23, 0xbd, 0x62, 0xf6, 0xd9, 0x57, 0xfa, 0x5c, 0xeb, 0x1b, 0x7a,
-	0x41, 0xb4, 0xf6, 0xa0, 0x84, 0x2f, 0xc4, 0xc8, 0xb5, 0x0e, 0xfc, 0xe1, 0x5b, 0xc7, 0x7b, 0xfc,
-	0xcd, 0xd0, 0x2d, 0xfc, 0xa5, 0x12, 0xe4, 0x4b, 0xec, 0xd4, 0x5b, 0xea, 0xae, 0x17, 0xd0, 0xc3,
-	0xd8, 0x14, 0x18, 0xe5, 0xb3, 0x00, 0x37, 0xb2, 0x78, 0xc9, 0xb6, 0x9a, 0xef, 0x4f, 0xfd, 0xfd,
-	0xea, 0xcc, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0x39, 0x6b, 0x15, 0x0e, 0xa7, 0x08, 0x00, 0x00,
+	0x14, 0xc6, 0x2b, 0xc9, 0x96, 0xec, 0x75, 0x12, 0xcc, 0x4e, 0x4a, 0x15, 0x13, 0x40, 0xe3, 0x29,
+	0x45, 0x14, 0xea, 0x0e, 0x8a, 0xc7, 0xc3, 0x14, 0x6e, 0x9a, 0xc6, 0x50, 0x06, 0x52, 0x66, 0x36,
+	0x0d, 0xbd, 0xf4, 0xc8, 0xf1, 0xc6, 0xa8, 0xc8, 0x5a, 0xcf, 0xee, 0x8a, 0xd4, 0x03, 0x17, 0x79,
+	0x08, 0x5e, 0x01, 0x1e, 0x81, 0x27, 0xe2, 0x41, 0x98, 0x73, 0x56, 0x7f, 0x12, 0x3b, 0xbe, 0x8a,
+	0x8f, 0xce, 0x77, 0xbe, 0xac, 0x7e, 0x7b, 0x74, 0x0e, 0xa1, 0x9a, 0x2b, 0x3d, 0x11, 0xd3, 0xb7,
+	0xfc, 0x42, 0xab, 0xc1, 0x52, 0x0a, 0x2d, 0xa8, 0xfb, 0x56, 0x89, 0x6c, 0x39, 0xed, 0x1d, 0xcc,
+	0x85, 0x98, 0xa7, 0xfc, 0x29, 0x3e, 0x9d, 0xe6, 0x97, 0x4f, 0xe3, 0x6c, 0x65, 0x24, 0xbd, 0x8f,
+	0xd7, 0x53, 0xb3, 0x5c, 0xc6, 0x3a, 0x11, 0x59, 0x91, 0x3f, 0x5c, 0xcf, 0x2b, 0x2d, 0xf3, 0x0b,
+	0x5d, 0x64, 0x3f, 0x59, 0xcf, 0xea, 0x64, 0xc1, 0x95, 0x8e, 0x17, 0xcb, 0x6d, 0xf6, 0x57, 0x32,
+	0x5e, 0x2e, 0xb9, 0x2c, 0x4e, 0xd8, 0xff, 0xdb, 0x26, 0xee, 0x59, 0xb2, 0x58, 0xa6, 0x9c, 0xde,
+	0x27, 0xae, 0x98, 0x4c, 0x85, 0x48, 0x7d, 0x2b, 0xb0, 0xc2, 0x16, 0x6b, 0x8a, 0x63, 0x21, 0x52,
+	0xfa, 0x80, 0x78, 0x62, 0x92, 0x64, 0xfa, 0x28, 0xf2, 0xed, 0xc0, 0x0a, 0x9b, 0xcc, 0x15, 0x3f,
+	0x40, 0x54, 0x25, 0x46, 0x43, 0xdf, 0x09, 0xac, 0xd0, 0x31, 0x89, 0xd1, 0x90, 0x1e, 0x90, 0x96,
+	0x98, 0xe4, 0xa6, 0xa4, 0x11, 0x58, 0xe1, 0x2e, 0xf3, 0xc4, 0x39, 0x86, 0x75, 0x6a, 0x34, 0xf4,
+	0x9b, 0x81, 0x15, 0x36, 0x8a, 0x54, 0x59, 0xa5, 0x4c, 0x95, 0x1b, 0x58, 0xe1, 0xfb, 0xcc, 0x13,
+	0x67, 0x37, 0xaa, 0x94, 0xa9, 0xf2, 0x02, 0x2b, 0xa4, 0x45, 0x6a, 0x34, 0x34, 0x87, 0xb8, 0x4c,
+	0x45, 0xac, 0xfd, 0x56, 0x60, 0x85, 0x36, 0x73, 0xc5, 0x77, 0x10, 0x99, 0x9a, 0x99, 0xc8, 0xa7,
+	0x29, 0xf7, 0xdb, 0x81, 0x15, 0x5a, 0xcc, 0x13, 0x27, 0x18, 0x16, 0x76, 0x5a, 0x26, 0xd9, 0xdc,
+	0x27, 0x81, 0x15, 0xb6, 0xc1, 0x0e, 0x43, 0x63, 0x37, 0x5d, 0x69, 0xae, 0xfc, 0x4e, 0x60, 0x85,
+	0x3b, 0xcc, 0x15, 0xc7, 0x10, 0xf5, 0xff, 0xb1, 0x89, 0xc7, 0xf8, 0x92, 0xc7, 0x5a, 0x01, 0x28,
+	0x59, 0x82, 0x72, 0x00, 0x94, 0x2c, 0x41, 0xc9, 0x0a, 0x94, 0x03, 0xa0, 0x64, 0x05, 0x4a, 0x56,
+	0xa0, 0x1c, 0x00, 0x25, 0x2b, 0x50, 0xb2, 0x06, 0xe5, 0x00, 0x28, 0x59, 0x83, 0x92, 0x35, 0x28,
+	0x07, 0x40, 0xc9, 0x1a, 0x94, 0xac, 0x41, 0x39, 0x00, 0x4a, 0x9e, 0xdd, 0xa8, 0xaa, 0x40, 0x39,
+	0x00, 0x4a, 0xd6, 0xa0, 0x64, 0x05, 0xca, 0x01, 0x50, 0xb2, 0x02, 0x25, 0x6b, 0x50, 0x0e, 0x80,
+	0x92, 0x35, 0x28, 0x59, 0x83, 0x72, 0x00, 0x94, 0xac, 0x41, 0xc9, 0x0a, 0x94, 0x03, 0xa0, 0xa4,
+	0x01, 0xf5, 0xaf, 0x4d, 0xdc, 0x37, 0xc9, 0x6c, 0xce, 0x35, 0x7d, 0x4c, 0x9a, 0x17, 0x22, 0x15,
+	0x12, 0xfb, 0x69, 0x2f, 0xda, 0x1f, 0x98, 0xaf, 0x61, 0x60, 0xd2, 0x83, 0x17, 0x90, 0x63, 0x46,
+	0x42, 0x9f, 0x80, 0x9f, 0x51, 0x03, 0xbc, 0x6d, 0x6a, 0x57, 0xe2, 0x5f, 0xfa, 0x88, 0xb8, 0x0a,
+	0xbb, 0x16, 0x2f, 0xb0, 0x13, 0xed, 0x95, 0x6a, 0xd3, 0xcb, 0xac, 0xc8, 0xd2, 0xcf, 0x0d, 0x10,
+	0x54, 0xc2, 0x39, 0x37, 0x95, 0x00, 0xa8, 0x90, 0x7a, 0xd2, 0x5c, 0xb0, 0xbf, 0x8f, 0x9e, 0xef,
+	0x95, 0xca, 0xe2, 0xde, 0x59, 0x99, 0xa7, 0x5f, 0x92, 0xb6, 0x9c, 0x94, 0xe2, 0xfb, 0x68, 0xbb,
+	0x21, 0x6e, 0xc9, 0xe2, 0x57, 0xff, 0x53, 0xd2, 0x34, 0x87, 0xf6, 0x88, 0xc3, 0xc6, 0x27, 0xdd,
+	0x7b, 0xb4, 0x4d, 0x9a, 0xdf, 0xb3, 0xf1, 0xf8, 0x55, 0xd7, 0xa2, 0x2d, 0xd2, 0x38, 0xfe, 0xe9,
+	0x7c, 0xdc, 0xb5, 0xfb, 0x7f, 0xd9, 0xa4, 0x71, 0x1a, 0x2f, 0x15, 0xfd, 0x86, 0x74, 0x16, 0xa6,
+	0x5d, 0x80, 0x3d, 0xf6, 0x58, 0x27, 0xfa, 0xb0, 0xf4, 0x07, 0xc9, 0xe0, 0x14, 0xfb, 0xe7, 0x4c,
+	0xcb, 0x71, 0xa6, 0xe5, 0x8a, 0xb5, 0x17, 0x65, 0x4c, 0x9f, 0x93, 0xdd, 0x05, 0xf6, 0x66, 0xf9,
+	0xd6, 0x36, 0x96, 0x7f, 0x74, 0xbb, 0x1c, 0xfa, 0xd5, 0xbc, 0xb6, 0x31, 0xe8, 0x2c, 0xea, 0x27,
+	0xbd, 0x6f, 0xc9, 0xde, 0x6d, 0x7f, 0xda, 0x25, 0xce, 0x6f, 0x7c, 0x85, 0xd7, 0xe8, 0x30, 0xf8,
+	0x49, 0xf7, 0x49, 0xf3, 0xf7, 0x38, 0xcd, 0x39, 0x8e, 0x84, 0x36, 0x33, 0xc1, 0x33, 0xfb, 0x6b,
+	0xab, 0xf7, 0x8a, 0x74, 0xd7, 0xed, 0x6f, 0xd6, 0xb7, 0x4c, 0xfd, 0xc3, 0x9b, 0xf5, 0x9b, 0x97,
+	0x52, 0xfb, 0xf5, 0x39, 0xd9, 0x39, 0x55, 0xf3, 0x37, 0x89, 0xfe, 0xf5, 0xe7, 0x8c, 0x8b, 0x4b,
+	0xfa, 0x01, 0x69, 0xea, 0x44, 0xa7, 0x1c, 0xdd, 0xda, 0x2f, 0xef, 0x31, 0x13, 0x52, 0x9f, 0xb8,
+	0x2a, 0x4e, 0x63, 0xb9, 0x42, 0x4b, 0xe7, 0xe5, 0x3d, 0x56, 0xc4, 0xb4, 0x47, 0xbc, 0x17, 0x22,
+	0x87, 0x83, 0xe0, 0x9c, 0x82, 0x1a, 0xef, 0xc2, 0x3c, 0x38, 0xf6, 0x48, 0x33, 0xcf, 0x12, 0x91,
+	0xf5, 0x1f, 0x91, 0x06, 0xe3, 0x71, 0x5a, 0xbf, 0x98, 0x85, 0x33, 0xc3, 0x04, 0x8f, 0x5b, 0xad,
+	0x59, 0xf7, 0xfa, 0xfa, 0xfa, 0xda, 0xee, 0x5f, 0x81, 0x19, 0x9c, 0xf1, 0x1d, 0x3d, 0x24, 0xed,
+	0x64, 0x11, 0xcf, 0x93, 0x0c, 0xfe, 0xa9, 0x91, 0xd7, 0x0f, 0xea, 0x92, 0xe8, 0x84, 0xec, 0x49,
+	0x1e, 0xa7, 0x13, 0xfe, 0x4e, 0xf3, 0x4c, 0x25, 0x22, 0xa3, 0x3b, 0x75, 0xb3, 0xc4, 0xa9, 0xff,
+	0xc7, 0xed, 0x6e, 0x2b, 0xec, 0xd9, 0x2e, 0x14, 0x8d, 0xcb, 0x9a, 0xfe, 0x7f, 0x0d, 0x42, 0x7e,
+	0xcc, 0xc4, 0x55, 0xf6, 0x7a, 0xb5, 0xe4, 0x8a, 0x3e, 0x24, 0x76, 0x9c, 0xf9, 0x7b, 0x58, 0xba,
+	0x3f, 0x30, 0x43, 0x7e, 0x50, 0x0e, 0xf9, 0xc1, 0xf3, 0x6c, 0xc5, 0xec, 0x38, 0xa3, 0x5f, 0x10,
+	0x67, 0x96, 0x9b, 0xef, 0xaf, 0x13, 0x1d, 0x6c, 0xc8, 0x4e, 0x8a, 0x55, 0xc3, 0x40, 0x45, 0x3f,
+	0x23, 0xb6, 0xd2, 0xfe, 0x0e, 0x6a, 0x1f, 0x6c, 0x68, 0xcf, 0x70, 0xed, 0x30, 0x5b, 0xc1, 0x77,
+	0x6d, 0x6b, 0x55, 0xdc, 0x5c, 0x6f, 0x43, 0xf8, 0xba, 0xdc, 0x40, 0xcc, 0xd6, 0x8a, 0x0e, 0x88,
+	0x33, 0x9b, 0xa6, 0x08, 0xbe, 0x13, 0x1d, 0x6e, 0x9e, 0x00, 0x07, 0xcd, 0x2f, 0x00, 0x99, 0x81,
+	0x90, 0x3e, 0x21, 0xce, 0x65, 0xaa, 0x71, 0x6d, 0x40, 0xd3, 0xaf, 0xeb, 0x71, 0x64, 0x15, 0xf2,
+	0xcb, 0x54, 0x83, 0x3c, 0x29, 0x56, 0xc9, 0x5d, 0x72, 0x6c, 0xe3, 0x42, 0x9e, 0x8c, 0x86, 0x70,
+	0x9a, 0x7c, 0x34, 0xc4, 0xf5, 0x72, 0xd7, 0x69, 0xce, 0x6f, 0xea, 0xf3, 0xd1, 0x10, 0xed, 0x8f,
+	0x22, 0xdc, 0x39, 0x5b, 0xec, 0x8f, 0xa2, 0xd2, 0xfe, 0x28, 0x42, 0xfb, 0xa3, 0x08, 0x17, 0xd1,
+	0x36, 0xfb, 0x4a, 0x9f, 0xa3, 0xbe, 0x81, 0x6b, 0xa4, 0xbd, 0x05, 0x25, 0x7c, 0x47, 0x46, 0x8e,
+	0x3a, 0xf0, 0x87, 0x89, 0x40, 0xb6, 0xf8, 0x9b, 0xd1, 0x5c, 0xf8, 0x2b, 0x2d, 0xe9, 0x57, 0xa4,
+	0x59, 0xef, 0xb2, 0xbb, 0x5e, 0x00, 0x47, 0xb6, 0x29, 0x30, 0xca, 0x67, 0x01, 0x69, 0x64, 0xf1,
+	0x82, 0xaf, 0xb5, 0xe8, 0x9f, 0xf8, 0x95, 0x63, 0xe6, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xca,
+	0xa2, 0x76, 0x34, 0xe8, 0x08, 0x00, 0x00,
 }
 }

+ 2 - 0
jsonpb/jsonpb_test_proto/test_objects.proto

@@ -31,6 +31,7 @@
 
 
 syntax = "proto2";
 syntax = "proto2";
 
 
+import "google/protobuf/any.proto";
 import "google/protobuf/duration.proto";
 import "google/protobuf/duration.proto";
 import "google/protobuf/struct.proto";
 import "google/protobuf/struct.proto";
 import "google/protobuf/timestamp.proto";
 import "google/protobuf/timestamp.proto";
@@ -116,6 +117,7 @@ message Complex {
 }
 }
 
 
 message KnownTypes {
 message KnownTypes {
+  optional google.protobuf.Any an = 14;
   optional google.protobuf.Duration dur = 1;
   optional google.protobuf.Duration dur = 1;
   optional google.protobuf.Struct st = 12;
   optional google.protobuf.Struct st = 12;
   optional google.protobuf.Timestamp ts = 2;
   optional google.protobuf.Timestamp ts = 2;