2016-12-01 63 views
0

的JSON轉換成Java對象正確類型的參考我有以下JSON輸出我從API獲得,什麼是用於使用傑克遜

{"HYR":"[{\"LastUpdatedBy\":\"Bug 101510: VMukkanagoudar\",\"IATACountryCode\":\"US\",\"MetroCodeBool\":false,\"AirportName\":\"Sawyer County\",\"Latitude\":46,\"CityName\":\"Hayward\",\"MajorAirportBool\":false,\"Longitude\":-91,\"StatusCode\":\"A\",\"DisplayNameLocal\":\"Hayward, WI (HYR-Sawyer County)\",\"DisplayNameInternational\":\"Hayward, WI, United States (HYR-Sawyer County)\",\"UpdateDate\":\"2009-03-06 20:44:00.0\",\"AirportCode\":\"HYR\",\"AirportID\":5396808,\"RegionName\":\"Wisconsin\",\"IdenticalMetroCodeBool\":false,\"ExternalName\":\"HYR\",\"CountryCode\":\"USA\"}]", 
"VAA":"[{\"LastUpdatedBy\":\"fmoneo\",\"IATACountryCode\":\"FI\",\"MetroCodeBool\":false,\"AirportName\":\" \",\"Latitude\":63,\"CityName\":\"Vaasa\",\"MajorAirportBool\":true,\"Longitude\":22,\"StatusCode\":\"A\",\"DisplayNameLocal\":\"Vaasa (VAA)\",\"DisplayNameInternational\":\"Vaasa, Finland (VAA)\",\"UpdateDate\":\"2008-08-12 17:26:00.0\",\"AirportCode\":\"VAA\",\"AirportID\":4276566,\"RegionName\":\" \",\"IdenticalMetroCodeBool\":false,\"ExternalName\":\"VAA\",\"CountryCode\":\"FIN\"}]" 
....(and so on)} 

JAVA對象是如下

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Config { 

    @JsonProperty("AirportCode") 
    String airportCode; 

    @JsonProperty("AirportID") 
    Integer airportId; 

    @JsonProperty("MetroCodeBool") 
    Boolean metroCodeBool; 

    @JsonProperty("MajorAirportBool") 
    Boolean majorAirportBool; 

    @JsonProperty("IdenticalMetroCodeBool") 
    Boolean identicalMetroCodeBool; 

    @JsonProperty("StatusCode") 
    Character statusCode; 

    //Getters and setters 
} 

轉換的代碼是

String jsonStr = apiCall(); 

if(jsonStr != null) 
{ 
    ObjectMapper mapper = new ObjectMapper(); 

    TypeReference<HashMap<String, ArrayList<Config>>> typeRef = new TypeReference<HashMap<String, ArrayList<Config>>>() {}; 

    HashMap<String, ArrayList<AirConfig>> configMap = mapper.readValue(jsonStr, typeRef); 
} 

但是,我得到的錯誤是

com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token 
at [Source: [email protected]; line: 1, column: 2] (through reference chain: java.util.HashMap["HYR"]) 

我相信我創建的TypeReference不正確。我應該如何改變它的任何解決方案。

+0

爲 「HYR」 你的JSON值是一個字符串,而不是一個數組(我認爲這是一些壞的JSON) – 2016-12-01 06:21:12

+0

_「轉換代碼大約是這個」_ - 對不起,這是不可接受的。沒有人會看看不能反映你實際使用的代碼。這個問題是目前形式的主題。 –

+0

@RC,這就是爲什麼我創建了一個Map,並且Map的關鍵字是String。應該把「HYR」作爲關鍵,不是嗎? –

回答

0

這個JSON在你的情況下是無效的。見部分

{"HYR":"[{\"LastUpdatedBy\":\"Bug 101510:

有一個"是不應該存在,所以有效的部分是這樣的:

{"HYR":[{\"LastUpdatedBy\":\"Bug 101510:

在你的情況,你需要的HYR的值是一個數組,但它的值爲String(由於引用)。刪除引號確實會生成有效的JSON數組。

+0

Thanks @ Antoniossss,不幸的是我可能無法更改API響應,因爲它不屬於我的團隊。是否有解決當前API響應的問題(即使用額外的「」) –

+0

有沒有,因爲這是無效的json。報告錯誤。對於解決方法,您可以盲目刪除第一個和最後一個引號,但這會使有效的字符串值無效。或者,如果值從'「{'或'」[「' – Antoniossss

+0

json非常有效,比如'{」aaa「:」bbb「}'是..]開始,則刪除第一個和最後一個引號。一個選項是去除兩次,一次得到字符串'「[{\」LastUpdat ...',並在該字符串上第二次獲取通緝名單 – 2016-12-01 06:55:52

0

json中還有額外的"在數組的起始和結尾處"[]"。你需要刪除它們。

try { 
     String jsonStr = "{\"HYR\":[{\"LastUpdatedBy\":\"Bug 101510: VMukkanagoudar\",\"IATACountryCode\":\"US\",\"MetroCodeBool\":false,\"AirportName\":\"Sawyer County\",\"Latitude\":46,\"CityName\":\"Hayward\",\"MajorAirportBool\":false,\"Longitude\":-91,\"StatusCode\":\"A\",\"DisplayNameLocal\":\"Hayward, WI (HYR-Sawyer County)\",\"DisplayNameInternational\":\"Hayward, WI, United States (HYR-Sawyer County)\",\"UpdateDate\":\"2009-03-06 20:44:00.0\",\"AirportCode\":\"HYR\",\"AirportID\":5396808,\"RegionName\":\"Wisconsin\",\"IdenticalMetroCodeBool\":false,\"ExternalName\":\"HYR\",\"CountryCode\":\"USA\"}]}"; 
     if (jsonStr != null) { 
      ObjectMapper mapper = new ObjectMapper(); 
      TypeReference<HashMap<String, ArrayList<Config>>> typeRef = new TypeReference<HashMap<String, ArrayList<Config>>>() {}; 
      HashMap<String, ArrayList<Config>> configMap = mapper.readValue(jsonStr, typeRef); 
      ArrayList<Config> configList = configMap.get("HYR"); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
0

使用(與您Config用適當的toString):

public static void main(String[] args) throws IOException { 
    String jsonStr = "{\"HYR\":\"[{\\\"LastUpdatedBy\\\":\\\"Bug 101510: VMukkanagoudar\\\",\\\"IATACountryCode\\\":\\\"US\\\",\\\"MetroCodeBool\\\":false,\\\"AirportName\\\":\\\"Sawyer County\\\",\\\"Latitude\\\":46,\\\"CityName\\\":\\\"Hayward\\\",\\\"MajorAirportBool\\\":false,\\\"Longitude\\\":-91,\\\"StatusCode\\\":\\\"A\\\",\\\"DisplayNameLocal\\\":\\\"Hayward, WI (HYR-Sawyer County)\\\",\\\"DisplayNameInternational\\\":\\\"Hayward, WI, United States (HYR-Sawyer County)\\\",\\\"UpdateDate\\\":\\\"2009-03-06 20:44:00.0\\\",\\\"AirportCode\\\":\\\"HYR\\\",\\\"AirportID\\\":5396808,\\\"RegionName\\\":\\\"Wisconsin\\\",\\\"IdenticalMetroCodeBool\\\":false,\\\"ExternalName\\\":\\\"HYR\\\",\\\"CountryCode\\\":\\\"USA\\\"}]\"}"; 
    ObjectMapper mapper = new ObjectMapper(); 

    // step one: deserialize the map 
    HashMap<String, String> configMap = mapper.readValue(jsonStr, new TypeReference<HashMap<String, String>>() {}); 

    // step two, deserialize the value for HYR 
    final String hyr = configMap.get("HYR"); 
    List<Config> configs = mapper.readValue(hyr, new TypeReference<List<Config>>() {}); 

    System.out.println(configs); 
} 

在這裏工作(傑克遜-2.3.2)和輸出:

[Foo.Config(airportCode=HYR, airportId=5396808, metroCodeBool=false, majorAirportBool=false, identicalMetroCodeBool=false, statusCode=A)]