大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。
在开发中,我们会经常遇见将java对象转换成json字符串以及将json字符串转换成对象的操作,使用 JSONObject.parseObject() 和JSONObject.toJSONString() 方法来实现这个过程。本文将介绍这两个方法的作用以及如何在 Java 中使用它们进行对象与 JSON 字符串之间的转换。
随着分布式系统和服务之间的通信变得日益普遍,将对象转换为 JSON 字符串以及将 JSON 字符串转换为对象变得至关重要。fastjson 库是阿里巴巴开源的一款高性能、功能丰富的Java JSON 库,提供了简单而灵活的方式来实现对象与 JSON 字符串之间的转换,所以首先 pom.xml 要引入fastjson 版本依赖:
<dependencies>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.54version>
dependency>
dependencies>
JSONObject.parseObject() 方法用于将 JSON 字符串转换为 Java 对象。它接受两个参数:要解析的 JSON 字符串和目标 Java 类的 Class 对象。该方法会根据 JSON 字符串的内容将其转换为相应的 Java 对象。
public static void main(String[] args) {
/*
{
"id":"1",
"name":"tom",
"age":"18",
"tel":"130"
}
*/
String jsonStr = "{\n" +
"\t\"id\":\"1\",\n" +
"\t\"name\":\"tom\",\n" +
"\t\"age\":\"18\",\n" +
"\t\"tel\":\"130\"\n" +
"}";
JSONObject jsonObj = JSONObject.parseObject(jsonStr);// 将json字符串转换成对象
String name = jsonObj.get("name").toString();
System.out.println(name);// name = "tom"
}
这种写法可以将 json 字符串的值解析到返回的 class 对象上,并且只映射class 对象上有的字段,没有的字段则为 null,例如下面的 id 是 int 类型,但是 json 是 string 类型的,也会给转义成 int 类型;json 没有 address 字段,所以 class 对象的 address 值为 null;
一般这种写法常见于前端发起请求进来,传入大量字符串,后端处理所需字段值
@Data
class Students {
private String name;
private String address;
private int id;
}
public static void main(String[] args) {
/*
{
"id":"1",
"name":"tom",
"age":"18",
"tel":"130"
}
*/
String jsonStr = "{\n" +
"\t\"id\":\"1\",\n" +
"\t\"name\":\"tom\",\n" +
"\t\"age\":\"18\",\n" +
"\t\"tel\":\"130\"\n" +
"}";
Students student = JSONObject.parseObject(jsonStr, Students.class);// 将json字符串转换成对象
System.out.println(student);// Students(name=tom, address=null, id=1)
}
该方法接受一个参数,即要转换为JSON字符串的Java对象。它会将Java对象的属性转换为对应的JSON字段,并生成相应的JSON字符串。
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("id","1");
map.put("name","jack");
map.put("age","18");
String jsonString = JSONObject.toJSONString(map);// 将对象转换成json字符串
System.out.println(jsonString);// {"name":"jack","id":"1","age":"18"}
}
JSONObject 源码如下:可以发现 JSONObject 继承了 JSON
public class JSONObject extends JSON implements Map<String, Object>, Cloneable, Serializable, InvocationHandler {
// ...
}
JSON源码如下:是一个抽象类
public abstract class JSON implements JSONStreamAware, JSONAware {
// ...
public static JSONObject parseObject(String text, Feature... features) {
return (JSONObject)parse(text, features);
}
}
JSON是一个抽象类,JSON 中有一个静态方法 parseObject(),将 text 解析为一个 JSONObject 对象并返回;JSONObject 是一个继承 JSON 的类,当调用 JSONObject.parseObject() 时,会直接调用父类的parseObject() 。两者在方法的调用上来说没什么区别,一个是用父类去调用父类自己的静态的 parseObject() 方法,一个是子类 JSONObject 去调用父类 JSON 的静态 parseObject() 方法,两者调的是同一个方法。
在使用这两个方法时,我们需要注意目标 Java 类的定义和属性与 JSON 字符串的结构和字段之间的对应关系。确保属性名和数据类型匹配,以便正确地进行转换。
在 Java 中使用它们进行对象与 JSON 字符串之间的转换,通过灵活运用这两个方法,可以更加便捷地处理 JSON 数据,提升Java编程的开发效率和性能。