public GrpcClientBuilder jsonMarshallerFactory(
            Function<? super ServiceDescriptor, ? extends GrpcJsonMarshaller> jsonMarshallerFactory) {
        requireNonNull(jsonMarshallerFactory, "jsonMarshallerFactory");
        return option(GRPC_JSON_MARSHALLER_FACTORY.newValue(jsonMarshallerFactory));
    }
Sets the factory that creates a {@link GrpcJsonMarshaller} that serializes and deserializes request or
response messages to and from JSON depending on the {@link SerializationFormat}. The returned
{@link GrpcJsonMarshaller} from the factory replaces the built-in {@link GrpcJsonMarshaller}.

<p>This is commonly used to:
<ul>
  <li>Switch from the default of using lowerCamelCase for field names to using the field name from
      the proto definition, by setting
      {@link MessageMarshaller.Builder#preservingProtoFieldNames(boolean)} via
      {@link GrpcJsonMarshallerBuilder#jsonMarshallerCustomizer(Consumer)}.
      <pre>{@code
      GrpcClients.builder(grpcServerUri)
                 .jsonMarshallerFactory(serviceDescriptor -> {
                     return GrpcJsonMarshaller.builder()
                                              .jsonMarshallerCustomizer(builder -> {
                                                  builder.preservingProtoFieldNames(true);
                                              })
                                              .build(serviceDescriptor);
                 })
                 .build();
      }</pre></li>
  <li>Set a customer marshaller for non-{@link Message} types such as {@code scalapb.GeneratedMessage}
      with {@code com.linecorp.armeria.common.scalapb.ScalaPbJsonMarshaller} for Scala.
      <pre>{@code
      GrpcClients.builder(grpcServerUri)
                 .jsonMarshallerFactory(_ => ScalaPbJsonMarshaller())
                 .build()
      }</pre></li>
</ul>
grpc/src/main/java/com/linecorp/armeria/client/grpc/GrpcClientBuilder.java