FastJSON
直接读代码:
@Log4j2
public class FastJsonTest {
@Test
public void test1() {
// JSON转对象-parseObject
String jsonString = "{\"name\":\"张三\",\"age\":18}";
Student student = JSON.parseObject(jsonString, Student.class);
log.info(JSON.toJSONString(student));
}
@Test
public void test2() {
// json转list-parseArray
String jsonString = "[{\"name\":\"张三\",\"age\":18},{\"name\":\"李四\",\"age\":19}]";
List<Student> students = JSON.parseArray(jsonString, Student.class);
for (Student student : students) {
log.info(JSON.toJSONString(student));
}
}
@Test
public void test3() {
// 对象转JSON
Student student = new Student();
student.setName("Gjkt");
student.setAge(3);
log.info(JSON.toJSONString(student));
}
@Test
public void test4() {
// list转JSON
List<Student> list = new ArrayList<>();
Student student1 = new Student();
Student student2 = new Student();
student1.setName("张三");
student2.setName("李四");
student1.setAge(3);
student2.setAge(6);
Collections.addAll(list, student1, student2);
log.info(JSON.toJSONString(list));
}
// -----------------JSONObject-来自fastJson2----------------------
@Test
public void test5() {
// JSON转JSONObject
String jsonString = "{\"name\":\"张三\",\"age\":18}";
JSONObject jsonObject = JSON.parseObject(jsonString);
log.info(JSON.toJSONString(jsonObject));
}
@Test
public void test6() {
// JSONObject转JSON
String jsonString = "{\"name\":\"张三\",\"age\":18}";
JSONObject jsonObject = JSON.parseObject(jsonString);
String name = jsonObject.getString("name");
log.info(name);
}
@Test
public void test7() {
// JSONObject转List(JSONObject->String->List)
String jsonString = "[{\"name\":\"张三\",\"age\":18},{\"name\":\"李四\",\"age\":19}]";
// log.info(t);
List<Student> list = JSONArray.parseArray(jsonString, Student.class);
for (Student student : list) {
log.info(student.toString());
}
log.info(JSON.toJSONString(list));
}
@Test
public void test8() {
// Map转JSONObject
Map<String, Student> map = new HashMap<>();
//
Student student1 = new Student();
Student student2 = new Student();
student1.setName("张三");
student2.setName("李四");
student1.setAge(3);
student2.setAge(6);
//
map.put("one", student1);
map.put("two", student2);
JSONObject json = (JSONObject) JSON.toJSON(map);
log.info(json);
}
@Test
public void test9() {
// fastJSON不会报错,会序列化为空JSON对象
String jsonString = "{\"name-cs\":\"张三\",\"age-cs\":18}";
JSONObject jsonObject = JSON.parseObject(jsonString);
Student student = JSON.to(Student.class, jsonObject);
log.info(student);
}
}
Jackson
@Log4j2
public class JacksonTest {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
@Test
public void test1() throws JsonProcessingException {
// JacksonTest-json键值对,不匹配或多于实体类字段
// String jsonString = "{\"name\":\"张三\",\"age\":18}";
String jsonString = "{\"name\":\"张三\",\"age\":18,\"cs\":\"雪豹闭嘴\"}";
log.info(jsonString);
ObjectMapper objectMapper = new ObjectMapper();
Student student = objectMapper.readValue(jsonString, Student.class);
log.info(student);
}
}
注意
Jackson和Fastjson是两个常用的Java库,都用于处理JSON数据。
都提供了将Java对象序列化为JSON格式以及将JSON数据反序列化为Java对象的功能。
Jackson和Fastjson在序列化机制上存在一些差异。
Jackson
的序列化机制依赖于JavaBean的规范,要求对象有对应属性的get方法。如果一个属性没有对应的get方法,Jackson在序列化时会抛出异常。
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:
解决方案:实体类上添加@JsonIgnoreProperties(ignoreUnknown = true)
注解
表示:
- 当将一个对象序列化为 JSON 时,如果该对象有任何未知的属性(即该对象的类中没有对应的字段或getter/setter方法),这些属性将被忽略,不会被序列化到 JSON 中。
- 当从 JSON 反序列化一个对象时,如果 JSON 中有任何未知的属性,Jackson 将忽略它们,而不会抛出异常或错误。这意味着你可以向一个对象添加额外的 JSON 属性,而不会引发异常。
Fastjson
则采用基于JavaBean的序列化和反序列化机制,在序列化时通过反射获取对象的属性信息,再通过get方法获取属性值,最终将其转换为JSON字符串。如果一个属性没有对应的get方法,Fastjson无法获取到其值,导致序列化结果为空的JSON对象。