Jackson asText() - печатает пустую строку

public class abc {
    @JsonRawValue
    @JsonDeserialize(using =abc.JsonAsStringDeserializer.class)
    private String  a1;
    private String a2;
}
   public static final class JsonAsStringDeserializer extends JsonDeserializer<String> {
        @Override
        public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
                throws IOException {
            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode tree = objectMapper.readTree(jsonParser);
            return tree.toString(); //want to use asText() here as toString doesn't always give valid json.
        }
    }

У меня возникла проблема при десериализации с использованием пользовательского десериализатора и метода asText() Джексона.

Serialized output comes out to be like this "{\"a1\":{\"dummy\":\"value\"},\"a2\":\"some data\"}";

В пользовательском десериализаторе (JsonAsStringDeserializer) получается значение {"dummy":"value"}, поскольку a1 использует только пользовательский десериализатор.

Я хотел бы вернуть всю строку {"dummy":"value"} в пользовательском десериализаторе. Это отлично работает, когда я использую метод toString(), однако, когда я использую tree.asText() [хочу использовать это для получения действительного json], он возвращает пустую строку. Я просмотрел документацию asText(), где говорится, что для использования asText() JsonNode должен быть ValueNode. Могу ли я что-то сделать по этому поводу? Я хотел бы использовать asText() для получения действительного json. Я также посмотрел на textValue(), и у него та же проблема, что и у asText().

Есть ли способ сделать этот {"dummy":"value"} ValueNode в Джексоне и вернуться с помощью tree.asText(). Я пробовал лить его, и он не работает.

Помощь приветствуется :)




Ответы (1)


Вы можете внести некоторые изменения в свой десериализатор:

public class JsonAsStringDeserializer extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser jp, DeserializationContext ctxt)
           throws IOException, JsonProcessingException {

        ObjectMapper mapper = (ObjectMapper) jp.getCodec();
        JsonNode node = mapper.readTree(jp);
        return mapper.writeValueAsString(node);
    }
}
person cassiomolin    schedule 27.06.2020
comment
Я пытался найти, но возвращает ли это return mapper.writeValueAsString(node); действительный json? - person mr-mwaaa; 27.06.2020