Jackson Parser — как сообщить обработчику объектов, что имя класса не в том же регистре, что и имя поля в ответе

У меня есть класс исполнителя запросов, который отправляет запрос веб-службе, а затем читает ответы и создает объект Java из ответа, используя ObjectMapper.readValue();

Моя проблема в том, что веб-сервис возвращает ответы в MixedCase, а не в правильном CamelCase для классов в ответе, например, следующий ответ:

    {
    "serviceResponse": {
        "header": {
            "success": "false",
            "dateTime": "2012-03-12 09:06:45.60 UTC",
            "errorCodes": [
                {
                    "code": "123",
                    "message": "error occured while trying to get response - User not Logged in",
                    "causeString": "css_idks"
                }
            ]
        },
        "body": {
            "cls": "lst",
            "empty": {}
        }
    }
}

Моя структура класса выглядит следующим образом: ServiceResponse.Java:

public class ServiceResponse implements Serializable {

    public ResponseHeader header;
    public ResponseBody body;
}

У меня также есть классы для ResponseHeader.java и ResponseBody.java, которые похожи. Проблема заключается в том, что хотя поле заголовка корректно демаршируется в объект ResponseHeader, поскольку имя параметра действительно является «заголовком», ServiceResponse завершается ошибкой, поскольку имя класса начинается с заглавной S, а не с строчной буквы s.

Я получаю следующее исключение при попытке проанализировать ответ:

03-12 11:14:14.078: E/ELAD(3473): org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "serviceResponse" (Class com.elad.ServiceResponse), not marked as ignorable

и если я добавлю аннотацию ignorable=true, она просто проанализирует ее, но все внутри будет нулевым...

Мне нужно знать, как аннотировать класс, чтобы я мог определить имя поля, с которым он должен сопоставляться, которое отличается от имени класса так же, как я могу сделать для полей\методов, используя @JsonProperty аннотация.

Обратите внимание, что я не могу изменить исполнителя запроса, поэтому я не могу добавить другой десериализатор или что-то в этом роде.


person ekatz    schedule 12.03.2012    source источник


Ответы (1)


Итак, я только что совершил глупую ошибку, но в надежде, что это поможет другим, я оставлю вопрос с моим ответом: я не должен был использовать ServiceResponse, поскольку класс передается в objectMapper.readValue(), но скорее DTO, который его содержит. Я сделал это для всех остальных типов данных и почему-то забыл сделать это здесь.

моя вина... :)

person ekatz    schedule 12.03.2012