没有String-argument构造函数/工厂方法从String值(”)反序列化

我在使用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; public ArrayList getActivity() { return activity; } public void setActivity(ArrayList activity) { this.activity = activity; } } 

Activity.java

 @JsonIgnoreProperties(ignoreUnknown = true) public class Activity { @JsonProperty("ActivityLocation") private ArrayList activityLocation; public ArrayList getActivityLocation() { return activityLocation; } public void setActivityLocation(ArrayList 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\": \"\" " + " } " + " } " + " }] " + "} "; 

所以,从这里更改json时会出现问题:

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

对此:

 { "ActivityLocation": { "Address": "" } } 

我没有为我的Address bean发送值,而只是一个空字符串。 不幸的是,我从第三方接收数据,无法控制我收到的数据。

是否需要添加注释才能处理此问题?

尝试设置mapper.configure(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true)

要么

 mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); 

取决于你的jackson版本。