Клиент Джерси отправляет строку с типом 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.