0

Web サービスが NULL ではなく空の文字列を返すため、Jackson がクラッシュします。カスタムパーサーを作成し、手動で解析しようとしていますか? どうすればこれを達成できますか?

ここで何が間違っていますか?私がやろうとしているのは、通常どおり JSON をオブジェクトに解析することだけです。フィールド名は @JsonProperty を使用してプロパティに追加されるため、パーサーはそれを変換する方法を知っている必要があります。

public class InsertReplyDeserializer extends JsonDeserializer<ListingReply> {

    @Override
    public ListingReply deserialize(JsonParser jsonParser, DeserializationContext arg1)
            throws IOException, JsonProcessingException {

        ObjectCodec oc = jsonParser.getCodec();
        JsonNode node = oc.readTree(jsonParser);

        // If service returns "" instead of null return a NULL object and don't try to parse
        if (node.getValueAsText() == "")
            return null;


       ObjectMapper objectMapper = new ObjectMapper();
       ListingReply listingReply = objectMapper.readValue(node, ListingReply.class);


       return listingReply;
    }

}
4

2 に答える 2

0

これが私がそれを解決した方法です

@Override
public MyObject deserialize(JsonParser jsonParser, DeserializationContext arg1)
        throws IOException, JsonProcessingException {

    ObjectCodec oc = jsonParser.getCodec();
    JsonNode node = oc.readTree(jsonParser);

    if (node.getValueAsText() == "")
        return null;

    MyObject myObject = new MyObject();
    myObject.setMyStirng(node.get("myString").getTextValue());

    JsonNode childNode = node.get("childObject");
    ObjectMapper objectMapper = new ObjectMapper();
    ChildObject childObject = objectMapper.readValue(childNode,
            ChildObject.class);

             myObject.setChildObject(childObject);
             return myObject;
}
于 2013-02-06T02:33:02.260 に答える
0

応答を手動で解析する必要があるかどうかはわかりません。あなたの解決策は機能しますが、私の意見では最適ではないようです。RestTemplate を使用しているように見えるので、独自のメッセージ コンバーターを作成 (またはパーサー コードを移動) する必要があります。次に、このコンバーターを残りのテンプレート オブジェクトに追加します。これにより、値が内部的に逆シリアル化されます。線に沿った何か、

public class CustomHttpmsgConverter extends  AbstractHttpMessageConverter<Object> {
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
   InputStream istream = inputMessage.getBody();
   String responseString = IOUtils.toString(istream);
   if(responseString.isEmpty()) //if your response is empty
     return null;
   JavaType javaType = getJavaType(clazz);
   try {
       return this.objectMapper.readValue(responseString, javaType);
   } catch (Exception ex) {
    throw new HttpMessageNotReadableException(responseString);
    }
}

//add this converter to your resttemplate
    RestTemplate template = new RestTemplate();
    List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>();
    converters.add(new CustomHttpmsgConverter());
    template.setMessageConverters(converters);
于 2013-02-17T23:21:45.247 に答える