2014-02-16 2 views
1

У меня есть следующий класс:ObjectMapper ошибка в Джексон

public class ServletStatus { 
    private int ElapsedTime; 
    private int TotalBusinessImpressionKeywordFailed; 
    private int TotalKeywordStatsFailed; 
    private int TotalRecentSearchesFailed; 
    private int TotalBusinessImpressionKeywordSaved; 
    private int TotalKeywordStatsSaved; 
    private int TotalRecentSearchesSaved; 

    private String error; 

    public String getError() { 
     return error; 
    } 

    public void setError(String error) { 
     this.error = error; 
    } 

    // rest of the getters and setters 
} 

и следующий JSON:

{"error": "Cannot Accept Request. Servlet has been Shut Down.. "} 

и я пытаюсь читать его следующим образом:

 ObjectMapper mapper = new ObjectMapper(); 
     ServletStatus status = mapper.readValue(in, ServletStatus.class); 

     String strResult = String.format("ElapsedTime(ms): %d, TotalBusinessImpressionKeywordFailed %d, TotalRecentSearchesFailed %d, TotalKeywordStatsFailed %d, TotalBusinessImpressionKeywordSaved %d, TotalKeywordStatsSaved %d, TotalRecentSearchesSaved %d, Success %s ", 
     status.getElapsedTime(), status.getTotalBusinessImpressionKeywordFailed(), status.getTotalRecentSearchesFailed(), status.getTotalKeywordStatsFailed(), status.getTotalBusinessImpressionKeywordSaved(), status.getTotalKeywordStatsSaved(), status.getTotalRecentSearchesSaved(), status.getError()); 

I получить следующее исключение:

java.io.EOFException: No content to map to Object due to end of input 
at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2775) 
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2718) 
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1886) 
at nightlybusinessstatsrestart.ShutDownBusinessStatsServlet.showdownServlet(ShutDownBusinessStatsServlet.java:38) 
at nightlybusinessstatsrestart.NightlyBusinessStatsRestart.main(NightlyBusinessStatsRestart.java:56) 

что я делаю неправильно? Мой JSON содержит только поле ошибки, где есть ошибка. В случае успеха, однако, я получаю следующие дополнительные поля:

ElapsedTime, TotalBusinessImpressionKeywordFailed, TotalKeywordStatsFailed, TotalRecentSearchesFailed, TotalBusinessImpressionKeywordSaved, TotalKeywordStatsSaved, TotalRecentSearchesSaved; 

ответ

1

Джексон использовать все свойства (поля) для генерации JSON для вывода, так что при попытке создать представление JSON для объекта ServletStatus, вам будет найти что-то вроде:

{ 
    ElapsedTime:"", 
    TotalBusinessImpressionKeywordFailed:"", 
    TotalKeywordStatsFailed:"", 
    TotalRecentSearchesFailed="", 
    . 
    . 
    . 
    error:"" 
} 

Если вы хотите только ошибка в JSON рассмотреть вопрос об использовании

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 

Или

public void setSerializationInclusion(JsonSerialize.Inclusion props) 
Method that will define global setting of which bean/map properties are to 
be included in serialization. 

И избежать неудачны, если свойства не включены во JSON чтения

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
Смежные вопросы