public override bool CanConvert(Type typeToConvert) { if (!typeof(IMessage).IsAssignableFrom(typeToConvert)) { return(false); } var descriptor = JsonConverterHelper.GetMessageDescriptor(typeToConvert); if (descriptor == null) { return(false); } return(JsonConverterHelper.IsWrapperType(descriptor)); }
public override void Write(Utf8JsonWriter writer, TMessage value, JsonSerializerOptions options) { var typeUrl = (string)value.Descriptor.Fields[Any.TypeUrlFieldNumber].Accessor.GetValue(value); var data = (ByteString)value.Descriptor.Fields[Any.ValueFieldNumber].Accessor.GetValue(value); var typeName = Any.GetTypeName(typeUrl); var descriptor = _settings.TypeRegistry.Find(typeName); if (descriptor == null) { throw new InvalidOperationException($"Type registry has no descriptor for type name '{typeName}'"); } var valueMessage = descriptor.Parser.ParseFrom(data); writer.WriteStartObject(); writer.WriteString(AnyTypeUrlField, typeUrl); if (JsonConverterHelper.IsWellKnownType(descriptor)) { writer.WritePropertyName(AnyWellKnownTypeValueField); if (JsonConverterHelper.IsWrapperType(descriptor)) { var wrappedValue = valueMessage.Descriptor.Fields[JsonConverterHelper.WrapperValueFieldNumber].Accessor.GetValue(valueMessage); JsonSerializer.Serialize(writer, wrappedValue, wrappedValue.GetType(), options); } else { JsonSerializer.Serialize(writer, valueMessage, valueMessage.GetType(), options); } } else { MessageConverter <Any> .WriteMessageFields(writer, valueMessage, _settings, options); } writer.WriteEndObject(); }