2015-02-23 4 views
1

Имейте относительно простую (я думаю) проблему, но быть послушником JSON, похоже, не может найти аккуратного решения.Поле JSON - Parse String to Int

У меня есть объект Entity с полем Id как тип Integer. Однако входящие данные Json, подлежащие сопоставлению, имеют id как строку.

С этой простой картой не представляется возможным. Есть ли способ изменить строковые данные в JSON на целое число перед сопоставлением?

Пример JSon данные

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

Пример Entity

@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); 
    } 
}