RestTemplateでREST APIを使用しています。私がAPIから得ている応答には、多くの入れ子オブジェクトがあります。ここでは例として、少し抜粋です:CustomDeserializerにデフォルトの(引数なし)コンストラクタがありません
"formularios": [
{
"form_data_id": "123006",
"form_data": {
"form_data_id": "123006",
"form_id": "111",
"efs": {
"1": {},
"2": "{\"t\":\"c\",\"st\":\"m\",\"v\":[{\"id\":\"3675\",\"l\":\"a) Just an example\",\"v\":\"1\"},{\"id\":\"3676\",\"l\":\"b) Another example.\",\"v\":\"2\"}]}"
}
}
私がいる問題は、時代のほとんどの「1」は実際には「2」のように、コンテンツを持っている、とジャクソンは単なる文字列としてそれを解析し、オブジェクト "efs"に追加します。しかし、コードスニペットと同じように、APIが空のまま送信し、JacksonがObjectとして取得すると、START_OBJECTについてのエラーが表示されます(正確なエラーは記憶できませんが、この質問には重要ではありません)。
私はカスタムデシリアライザを作ることにしました。そのため、jacksonが "1"と読むと、空のオブジェクトは無視され、null文字列として解析されます。ここで
は私のカスタムデシリアライザです:
public class CustomDeserializer extends StdDeserializer<Efs> {
public CustomDeserializer(Class<Efs> t) {
super(t);
}
@Override
public Efs deserialize(JsonParser jp, DeserializationContext dc)
throws IOException, JsonProcessingException {
String string1 = null;
String string2 = null;
JsonToken currentToken = null;
while ((currentToken = jp.nextValue()) != null) {
if (currentToken.equals(JsonToken.VALUE_STRING)) {
if (jp.getCurrentName().equals("1")) {
string1 = jp.getValueAsString();
} else {
string2 = jp.getValueAsString();
}
} else {
if (jp.getCurrentName().equals("2")) {
string2 = jp.getValueAsString();
}
}
}
return new Efs(string1, string2);
}
}
そして、これがAPIからの応答を受信したとき、私はそれを使用している方法です。
ObjectMapper mapper = new ObjectMapper();
SimpleModule mod = new SimpleModule("EfsModule");
mod.addDeserializer(Efs.class, new CustomDeserializer(Efs.class));
mapper.registerModule(mod);
List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter();
jsonMessageConverter.setObjectMapper(mapper);
messageConverters.add(jsonMessageConverter);
RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(messageConverters);
私はエラーを取得しています:
CustomDeserializer has no default (no arg) constructor
しかし、私が間違ってやっていることや解決方法を正確にはわかりません。長い質問の助けと謝罪のおかげで、私はできるだけ多くの文脈を与えたいと思っていました。
すごいああ、私はダム笑を感じるが、ええ、それは、おかげで働いていた:あなたは何ができるか は1を作成(またはあなたが本当にそれを必要としない場合は、他のものを置き換える)です。 – abril