[英]Ignoring not set primitive type while converting an object to json using jackson
[英]What is correct type reference for converting the json into java object using jackson
我有以下從api獲得的json輸出,
{"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: java.io.StringReader@2b82d59e; line: 1, column: 2] (through reference chain: java.util.HashMap["HYR"])
我相信我創建的TypeReference不正確。 任何有關如何更改它的解決方案。
在您的情況下,此JSON無效。 看部分
{"HYR":"[{\\"LastUpdatedBy\\":\\"Bug 101510:
有一種"
不應該在那里,所以有效的部分是這樣的:
{"HYR":[{\\"LastUpdatedBy\\":\\"Bug 101510:
在您的情況下,您需要將HYR
的值設置為數組,但該值必須為String
值(由於引用)。 刪除引號確實會產生有效的JSON數組。
數組"[
]"
開頭和結尾處的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();
}
}
使用(與您的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)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.