2017-07-14 7 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; 
    } 
} 
は、だから、

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

:私は、私は上記のエラーに遭遇したときに

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のデータを調整

がある:ここでは

0は、私が正しくJSONをマッピングすることができるコードですこれに

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

:このからJSONを変更するときに、問題が起こる

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

私のAddressの値を送信する代わりに、空の文字列を取得しています。残念ながら、私は第三者からデータを受け取り、受け取ったデータを管理することはできません。

これを処理するために追加する必要がある注釈はありますか?

答えて

5

は、あなたのジャクソンのバージョンに応じて、mapper.configure(DeserializationConfig.Feature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true)

または

mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); 

を設定してみてください。

+0

はい、それは私の問題を解決しました。どうもありがとうございました! – Stephen

関連する問題