Десериализация или сериализация любого типа объекта с использованием Jackson ObjectMapper и обработка исключений - PullRequest
2 голосов
/ 25 мая 2019

В настоящее время у меня есть этот код, который я пытаюсь реорганизовать, чтобы учесть больше возможных типов классов (упрощенный с помощью фиктивного кода, но суть та же):

private String serializeSomething(final SomeSpecificClass something) {
    try {
        return mapper.writeValueAsString(someething);
    } catch (final IOException e) {
        throw new SomeCustomException("blah", e);
    }
}

private SomeSpecificClass deserializeSomething(final String payload) {
    try {
        return mapper.readValue(payload, SomeSpecificClass.class);
    } catch (final IOException e) {
        // do special things here
        throw new SomeCustomException("blah", e);
    }
}

Недавно мы обнаружили, чтонам, вероятно, придется принять другие типы здесь, а не только SomeSpecificClass.Есть ли лучший способ сделать это без необходимости менять все на Object вместо SomeSpecificClass?Чтобы мы могли вернуть правильный тип в deserializeSomething (и не нужно приводить его после получения возвращаемого значения от вызывающей стороны)?

1 Ответ

2 голосов
/ 25 мая 2019

Начать с примера реализации:

class JsonObjectConverter {

    private ObjectMapper mapper = new ObjectMapper();

    public String serialiseToJson(Object value) {
        try {
            return mapper.writeValueAsString(value);
        } catch (JsonProcessingException e) {
            throw new IllegalArgumentException("Could not serialise: " + value, e);
        }
    }

    public <T> T deserialiseFromJson(String json, Class<T> clazz) {
        try {
            return mapper.readValue(json, clazz);
        } catch (IOException e) {
            throw new IllegalArgumentException("Could not deserialize: " + clazz, e);
        }
    }

    public SomeSpecificClass deserialiseToSomeSpecificClass(String json) {
        return deserialiseFromJson(json, SomeSpecificClass.class);
    }
}

Вы можете написать два основных метода: serialiseToJson и deserialiseFromJson, которые могут сериализовать любой тип до JSON и десериализовать JSON полезную нагрузку до заданной Class. Конечно, вы можете реализовать некоторые дополнительные методы для наиболее распространенных и наиболее используемых классов, таких как deserialiseToSomeSpecificClass. В этом формате вы можете написать столько методов, сколько вам нужно: deserialiseToXYZ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...