Вы можете использовать следующее
import com.fasterxml.jackson.annotation.JsonRootName;
@JsonRootName(value = "payment_token")
public class PaymentToken {
...
}
Ссылка: JsonRootName
Если вы добавите аннотацию выше, давайте посмотрим, как она работает
Добавить следующую конфигурацию вObjectMapper
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.SerializationFeature;
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);
mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); // additional to your config
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
String paymentToken = "{\"payment_token\":{\"client_id\":\"test\",\"currency_code\":\"USD\"}}";
System.out.println(mapper.readValue(paymentToken, PaymentToken.class));
System.out.println(mapper.writeValueAsString(paymentToken));
вывод:
PaymentToken (clientId = test, currencyCode = USD)
{"String": "{\" payment_token \ ": {\"client_id \ ": \" test \ ", \" currency_code \ ": \" USD \ "}}"}
Как вы можете видеть выше, objectMapper правильно десериализуется и сериализуется.