code: public static Message fromJson(Message.Builder builder, JsonObject input) throws Exception {
      Descriptors.Descriptor descriptor = builder.getDescriptorForType();
      for (Map.Entry<String, JsonElement> entry : input.entrySet()) {
        String protoName = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, entry.getKey());
        Descriptors.FieldDescriptor field = descriptor.findFieldByName(protoName);
        if (field == null) {
          throw new Exception("Can't find descriptor for field " + protoName);
        }
        if (field.isRepeated()) {
          if (!entry.getValue().isJsonArray()) {
            // fail
          }
          JsonArray array = entry.getValue().getAsJsonArray();
          for (JsonElement item : array) {
            builder.addRepeatedField(field, parseField(field, item, builder));
          }
        } else {
          builder.setField(field, parseField(field, entry.getValue(), builder));
        }
      }
      return builder.build();
    }
docs: Converts a JSON object to a protobuf message
  
  @param builder the proto message type builder
  @param input the JSON object to convert