2015-02-23 181 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); 
    } 
}