Используя Джексона, я пытаюсь кодировать данные в JSON, и это дает исключение.
Я попробовал данные String & byte []:
String representation of same data is here:
Bytes converted to String-------->>
{
"appname": "aaa",
"deviceType": "diehdcj",
"reportedDate": "2015-05-03T15:38:45+00:00",
"sessionId": "5366372183482-6736-23562378",
"deviceId": "2151272389",
"commandName" : "wqgduwusdue",
"protocolVersion" : "0.1",
"protocolName" : "whjs_ashk_ask",
"data" : "false"
}
Ява
16: 50: 46.065 [] [] ERROR AAATSHConnector [http-apr-10.40.120.85-80-exec-3] - Исключение анализа JSON: не удалось декодировать VALUE_STRING как base64 (MIME-NO-LINEFEEDS): Незаконный символ '' ' (код 0x22) в содержимом base64
Здесь код, который выполняет синтаксический анализ:
Ява
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response retrieveDevicePassword(InputStream request, @Context HttpServletRequest servletRequest) throws BadRequestException, ValidationException, UnknownServerException
{
ObjectMapper objectMapper = new ObjectMapper();
DemoRequest req = null;
DemoRequest res = null;
byte[] data = null;
data= IOUtils.toByteArray(request);
DemoRequest = objectMapper.readValue(data, DemoRequest.class); //It where the Exception occurs
Ява
//Snippet of POJO
@XmlRootElement(name = "demoRequest")
@JsonInclude(Include.NON_EMPTY)
public class DemoRequest {
private String commandName;
private String sessionId;
private byte[] data;
//getters & setters
}
Удивительно, когда я пытаюсь преобразовать одну и ту же строку или байт [] с небольшим изменением фактических данных "data": "true", он работает.
Кто-нибудь может помочь
Нашел решение, но не знаю, что он делает: если я помещаю escape-символ перед false, например "data": "\ false", он отлично работает.
Что может быть объяснением этого?
JSON Parsing Exception: Не удалось декодировать VALUE_STRING как base64 (MIME-NO-LINEFEEDS): Незаконный символ "" (код 0x22) в содержимом base64
Вышеупомянутое исключение возникает, когда свойство имеет тип байта [], а содержимое json представлено в String. Джексон считает, что в этом случае данные json представлены как закодированные base64 и пытаются декодировать его на байт []. Если строка, присутствующая в поле данных, не является правильно кодированной строкой base64, джексон повышает указанное выше исключение.
Попробуйте добавить специальный сеттер для поля data
:
void setData(String data) { this.data = data.getBytes(); }