Клиент Джерси отправляет строку с типом application/json

Мне нужно отправить строку, которая уже находится в JSON формат с использованием Jersey client 1.19 а также genson 1.3

Client.create().resource(path).webResource.type(MediaType.APPLICATION_JSON_TYPE)
.accept(MediaType.APPLICATION_JSON_TYPE).put(ClientResponse.class, jsonAsString)

Проблема в том, что клиент анализирует строку, мне нужно, чтобы она была отправлена ​​как есть. Я отправляю что-то вроде { "name":"Foo" } и клиент конвертирует его в "{ \"name\":\"Foo\" }", Если я изменю тип на PLAIN_TEXT он отправляет запрос правильно, но мне нужно отправить его как application/json,

3 ответа

Решение

Так что да, Генсон будет пытаться закодировать вашу строку в виде буквенной строки json. В этом случае это может быть не то, что вы хотели бы, но в целом это то, что люди ожидают: сериализацию строки java как строки json.

Решение, которое я вижу, является слишком расширенным GensonJsonConverter и переопределить isWritable, чтобы возвращать false, когда тип ввода - строка. Тогда просто зарегистрировать его. Это должно работать.

Я открыл эту проблему, чтобы ее можно было добавить как более гибкую функцию.

Попробуйте изменить MediaType.APPLICATION_JSON_TYPE в MediaType.APPLICATION_JSON http://examples.javacodegeeks.com/enterprise-java/rest/jersey/json-example-with-jersey-jackson/

Я попробовал ваш код на Джерси 1.19, Генсоне 1.3 и Wireshark. Он работает нормально без Genson, поэтому кажется, что Genson рассматривает его как буквальную строку (так как он имеет тип String) и поэтому цитируем двойные кавычки.

Следующие работы.

    String jsonAsString = "{ \"name\":\"Foo\" }";
    Map<String, String> map = (new Genson()).deserialize(jsonAsString, Map.class);
    String path = "...";
    ClientResponse resp = 
            Client.create().resource(path)
            .type(MediaType.APPLICATION_JSON_TYPE)
            .accept(MediaType.APPLICATION_JSON_TYPE)
            .put(ClientResponse.class, map);

Я использовал Map, потому что этого достаточно для примера, но вы можете десериализовать его для соответствующего объекта.

Если вы ищете опцию, чтобы указать, что строка должна быть передана как есть, я еще не знаю об этом, но это должно по крайней мере обеспечить решение проблемы отправки этой строки как application/json.

Другие вопросы по тегам