近期做项目的时候,发现使用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