近期做項目的時候,發現使用net.sf.json包中的JSONObject或JSONArray將對象轉為json數據結構存在一個坑。當對String類型的屬性賦值為null情況下,轉為json結構為"",但前端需要為null。而包com.fasterxml.jackson可以將原來null轉為json中的null。特記錄於此,舉例說明如下:
User實體:
public class User { String name; Integer age; public User() { super(); } public User(String name, Integer age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
net.sf.json包
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class Test { public static void main(String[] args) { User user = new User("bob",12); User user1 = new User(null,null); List<User> list = new ArrayList<>(); list.add(user1); list.add(user); System.out.println(JSONObject.fromObject(user1)); JSONArray jsonArray = JSONArray.fromObject(list); System.out.println(jsonArray.toString()); Map<String, String> map = new HashMap<>(); map.put("data", null); System.out.println(JSONObject.fromObject(map)); } }
輸出:
{"age":0,"name":""} [{"age":0,"name":""},{"age":12,"name":"bob"}] {"data":null}
從輸出可以看出,JSONObject或JSONArray轉換對象,當對象中String類型的屬性值為null時,轉換為json數據"",Integer屬性為null時,轉換為0.
另外,Map中值為null的情況,轉為json數據為null。
com.fasterxml.jackson包
import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; public class Test1 { public static void main(String[] args) { User user = new User("bob",12); User user1 = new User(null,null); List<User> list = new ArrayList<>(); list.add(user1); list.add(user); ObjectMapper objectMapper = new ObjectMapper(); try { JsonNode jsonNode = objectMapper.readTree(objectMapper.writeValueAsString(list)); System.out.println(jsonNode.toString()); Map<String, String> map = new HashMap<>(); map.put("data", null); System.out.println(objectMapper.writeValueAsString(map)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
輸出:
[{"name":null,"age":null},{"name":"bob","age":12}] {"data":null}
采用該工具轉換的時候,String屬性為null情況,轉換json后也為null;但Integer也會被轉成null,這可能會引起其他問題。
Map中的null,轉換為json也為null。
總結:
在轉換json的時候,可以考慮使用net.sf.json工具,代碼邏輯簡單,並且不會出現Integer轉為null的情況。當然需要跟前端保持一致。
參考:
https://www.yiibai.com/jackson/jackson_first_application.html