在使用Java的Jackson庫將對象轉換成JSON數據時,有可能會遇到報“空指針異常”的情況。這種情況一般是由于對象中的某個屬性為null導致的。下面是一個例子:
User user = new User(); user.setUsername("Tom"); user.setAge(null); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(user); System.out.println(json);
上面的代碼中,User對象的age屬性被設為null,當使用Jackson庫將其轉換成JSON數據時,程序報了一個空指針異常。
解決這個問題的方法有兩種:
第一種方法是使用@JsonInclude注解。這個注解可以控制序列化過程中哪些屬性需要被包含進去。比如,在User類的定義中,加入如下注解:
{@literal @}JsonInclude(JsonInclude.Include.NON_NULL) public class User { private String username; {@literal @}JsonProperty("age") private Integer age; // 省略getter和setter方法 }
在@JsonProperty注解中給age屬性起了個別名"age"。這個注解也可以用來避免屬性名和關鍵字重復。@JsonInclude注解中的參數表明,只有當age不為null時,才對其進行序列化。
第二種方法是使用SimpleModule。SimpleModule是Jackson庫提供的一個類,它可以為Java對象注冊序列化和反序列化器。比如,在User類的定義中,加入如下代碼:
ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addSerializer(Integer.class, new JsonSerializer<Integer>() { {@literal @}Override public void serialize(Integer value, JsonGenerator gen, SerializerProvider serializers) throws IOException { if (value == null) { gen.writeNull(); } else { gen.writeNumber(value); } } }); mapper.registerModule(module); String json = mapper.writeValueAsString(user); System.out.println(json);
上面的代碼中,我們為Integer類型注冊了一個序列化器。如果需要序列化的值是null,那么我們就手動把null值寫入輸出流。這個方法雖然比第一種方法稍微麻煩一點,但是它可以控制序列化的方式,實現更細粒度的控制。