2017-07-14 71 views
3

當我使用com.fasterxml.jackson.databind包中的ObjectMapper類時出現json解析問題,並且出現的錯誤是:沒有字符串參數的構造函數/工廠方法來反序列化字符串值('')

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.graybar.utilities.ups.beans.Address: no String-argument constructor/factory method to deserialize from String value ('') 

發生此問題的Web應用程序是使用AngularJS前端的Spring MVC應用程序,但我可以使用更小的所有Java程序來複制該問題。這裏是我的豆子:

Shipment.java

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Shipment { 
    @JsonProperty("Activity") 
    private ArrayList<Activity> activity; 
    public ArrayList<Activity> getActivity() { 
     return activity; 
    } 
    public void setActivity(ArrayList<Activity> activity) { 
     this.activity = activity; 
    } 
} 

Activity.java

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Activity { 
    @JsonProperty("ActivityLocation") 
    private ArrayList<ActivityLocation> activityLocation; 
    public ArrayList<ActivityLocation> getActivityLocation() { 
     return activityLocation; 
    } 
    public void setActivityLocation(ArrayList<ActivityLocation> activityLocation) { 
     this.activityLocation = activityLocation; 
    } 
} 

ActivityLocation.java

@JsonIgnoreProperties(ignoreUnknown = true) 
public class ActivityLocation { 
    @JsonProperty("Address") 
    private Address address; 
    public Address getAddress() { 
     return address; 
    } 
    public void setAddress(Address address) { 
     this.address = address; 
    } 
} 

Address.java

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Address { 
    @JsonProperty("City") 
    private String city; 
    @JsonProperty("StateProvinceCode") 
    private String stateProvinceCode; 
    @JsonProperty("CountryCode") 
    private String countryCode; 
    public String getCity() { 
     return city; 
    } 
    public void setCity(String city) { 
     this.city = city; 
    } 
    public String getCountryCode() { 
     return countryCode; 
    } 
    public void setCountryCode(String countryCode) { 
     this.countryCode = countryCode; 
    } 
    public String getStateProvinceCode() { 
     return stateProvinceCode; 
    } 
    public void setStateProvinceCode(String stateProvinceCode) { 
     this.stateProvinceCode = stateProvinceCode; 
    } 
} 

下面是代碼哪裏可以適當地映射JSON:

public static void main(String[] args) { 
    String jsonMessage = "" + 
     "{" + 
     " \"Activity\": [{ " + 
     "  \"ActivityLocation\": { " + 
     "   \"Address\": { " + 
     "    \"City\": \"Hana\", " + 
     "    \"StateProvinceCode\": \"Hi\", " + 
     "    \"CountryCode\": \"US\" " + 
     "   } " + 
     "  } " + 
     " }, " + 
     " { " + 
     "  \"ActivityLocation\": { " + 
     "   \"Address\": { " + 
     "    \"City\": \"Honolulu\", " + 
     "    \"StateProvinceCode\": \"Hi\", " + 
     "    \"CountryCode\": \"US\" " + 
     "   } " + 
     "  } " + 
     " }] " + 
    "} "; 

    try { 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY); 

     Shipment shipment = mapper.readValue(jsonMessage, Shipment.class); 
     System.out.println("shipment.toString = " + shipment.toString()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

當在jsonMessage VAR調整數據是當我碰上我上面提到的錯誤:

"{" + 
    " \"Activity\": [{ " + 
    "  \"ActivityLocation\": { " + 
    "   \"Address\": { " + 
    "    \"City\": \"Hana\", " + 
    "    \"StateProvinceCode\": \"Hi\", " + 
    "    \"CountryCode\": \"US\" " + 
    "   } " + 
    "  } " + 
    " }, " + 
    " { " + 
    "  \"ActivityLocation\": { " + 
    "   \"Address\": \"\" " + 
    "   } " + 
    "  } " + 
    " }] " + 
    "} "; 

所以

{ 
    "ActivityLocation": { 
     "Address": { 
      "City": "Honolulu", 
      "StateProvinceCode": "Hi", 
      "CountryCode": "US" 
     } 
    } 
}] 

這樣::

,改變從這個JSON當問題發生10
{ 
"ActivityLocation": { 
    "Address": "" 
    } 
} 

代替爲我的Address bean發送值,我只得到一個空字符串。不幸的是,我收到來自第三方的數據,無法控制我收到的數據。

是否有需要添加的註釋來處理這個問題?

回答

5

嘗試設置mapper.configure(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true)

mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); 

根據您的傑克遜版本。

+0

是的,這解決了我的問題。非常感謝你! – Stephen

相關問題