2015-02-23 179 views
1

有一個相對簡單(我認爲)的問題,但作爲JSON的新手似乎無法找到一個簡潔的解決方案。JSON字段 - 將字符串解析爲Int

我有一個Id類型爲Integer的實體對象。但是,要映射的傳入Json數據具有作爲字符串的id。

有了這個簡單的地圖似乎不可能。有沒有辦法在映射之前將JSON中的字符串數據更改爲整數?

例JSON數據

{"Id": "021", "userAge": 99} 

例實體

@Entity 
public class User{ 

    @id 
    int userId; 
    int userAge; 
} 

非常感謝。

回答

4

您不需要。

如果目標字段是數字,Jackson的智能足以將JSON字符串轉換爲數值。

這並不明顯,領先的0是代表什麼,但傑克遜會簡單地忽略它。

此外,如果您的字段名稱在Java中不同,則需要@JsonProperty("theJsonName")

public class Jackson { 
    public static void main(String[] args) throws Exception { 
     String json = "{\"userId\": \"021\", \"userAge\": 99}"; 
     ObjectMapper mapper = new ObjectMapper(); 
     User user = mapper.readValue(json, User.class); 
     System.out.println(user.userId); 
    } 
} 

class User { 
    int userId; 
    int userAge; 
    public void setUserId(int userId) { 
     this.userId = userId; 
    } 
    public void setUserAge(int userAge) { 
     this.userAge = userAge; 
    } 
} 

打印

21 
1

您可以編寫自定義傑克遜解串器來應對此行爲。有關於此主題here的好博客文章。

public class ItemDeserializer extends JsonDeserializer<Item> { 

    @Override 
    public Item deserialize(JsonParser jp, DeserializationContext ctxt) 
     throws IOException, JsonProcessingException { 
     JsonNode node = jp.getCodec().readTree(jp); 
     int id = Integer.parseInt(node.get("userId").asText()); 
     int userAge = (Integer) ((IntNode) node.get("userAge")).numberValue(); 

     return new Item(id, userAge); 
    } 
}