赞
踩
<!-- Fastjson 不指定版本号会报错-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
创建实体类:Person
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private int age;
private String fullName;
private Date dateOfBirth;
}
@Test
public void test1() {
Person person = new Person();
person.setAge(12);
person.setDateOfBirth(new Date());
person.setFullName("会儿物管费");
String personStr = JSON.toJSONString(person);
System.out.println("转化后的字符串是:"+personStr);
}
打印结果:
转化后的字符串是:{"age":12,"dateOfBirth":1653734705701,"fullName":"会儿物管费"}
@Test
public void test2() {
String personStr = "{\"age\":12,\"dateOfBirth\":1653727927858,\"fullName\":\"会儿物管费\"}";
Person person = JSON.parseObject(personStr, Person.class);
System.out.println("打印出来的实体是:"+person);
}
打印结果:
打印出来的实体是:Person(age=12, fullName=会儿物管费, dateOfBirth=Sat May 28 16:52:07 CST 2022)
String personStr = "{\"age\":12,\"dateOfBirth\":1653727927858,\"fullName\":\"会儿物管费\"}";
Map<String,Object> map = JSONObject.parseObject(personStr);// //json对象转Map
System.out.println("打印出来的map是:"+map);
for (Map.Entry<String,Object> entry:map.entrySet()){
System.out.println("key值是:"+entry.getKey()+" value值是:"+entry.getValue());
}
打印结果:
打印出来的map是:{"fullName":"会儿物管费","dateOfBirth":1653727927858,"age":12}
key值是:fullName value值是:会儿物管费
key值是:dateOfBirth value值是:1653727927858
key值是:age value值是:12
Map<String, Object> map = new HashMap<>();
map.put("age",18);
map.put("fullName","刘诗诗");
map.put("dateOfBirth",new Date());
System.out.println("打印出来的map是:"+map);
JSONObject json = new JSONObject(map);
System.out.println("打印出来的json是:"+json);
打印结果:
打印出来的map是:{fullName=刘诗诗, dateOfBirth=Sat May 28 23:31:23 CST 2022, age=18}
打印出来的json是:{"fullName":"刘诗诗","dateOfBirth":1653751883779,"age":18}
Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,
但自从在2008年五月公开发布第一版后已被许多公司或用户应用。
Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。
而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。
类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。
目前,Gson最新版是2.8.6,我们就用这个版本演示。在pom文件中添加Maven的Gson依赖,Gson是不依赖其它jar包的。
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
在开发中,Json转换的场景往往也就是那么几个。
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private String name;
private int age;
private boolean isMale;
private List<String> hobbies;
//重写toString方法,便于查看控制台输出。
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("Person{");
sb.append("name='").append(name).append('\'');
sb.append(", age=").append(age);
sb.append(", isMale=").append(isMale);
sb.append(", hobbies=").append(hobbies);
sb.append('}');
return sb.toString();
}
}
import com.google.gson.Gson;
// 创建Bean
Person p = new Person("刘亦菲", 16, false, Arrays.asList("明星", "神雕侠侣"));
// 创建Gson对象
Gson gson = new Gson();
// 调用Gson的String toJson(Object)方法将Bean转换为json字符串
String pJson = gson.toJson(p);
System.out.println(pJson);
打印结果:
{"name":"刘亦菲","age":16,"isMale":false,"hobbies":["明星","神雕侠侣"]}
import com.google.gson.Gson;
// 创建Bean
Person p = new Person("刘亦菲", 16, false, Arrays.asList("明星", "神雕侠侣"));
// 创建Gson对象
Gson gson = new Gson();
// 调用Gson的String toJson(Object)方法将Bean转换为json字符串
String pJson = gson.toJson(p);
// 调用Gson的 <T> t fromJson(String, Class)方法,将Json串转换为对象
Person person = gson.fromJson(pJson, Person.class);
System.out.println(person);
打印结果:
Person{name='刘亦菲', age=16, isMale=false, hobbies=[明星, 神雕侠侣]}
大致步骤和转换普通JavaBean一样。
// 先准备一个List集合
List<Person> list = new ArrayList<Person>();
list.add(new Person("刘亦菲", 16, false, Arrays.asList("明星", "神雕侠侣")));
list.add(new Person("林耀东", 45, true, Arrays.asList("村支书", "破冰行动")));
System.out.println(list);
// 创建Gson实例
Gson gson = new Gson();
// 调用Gson的toJson方法
String listJson = gson.toJson(list);
System.out.println(listJson);
打印结果:
[Person{name='刘亦菲', age=16, isMale=false, hobbies=[明星, 神雕侠侣]}, Person{name='林耀东', age=45, isMale=true, hobbies=[村支书, 破冰行动]}]
[{"name":"刘亦菲","age":16,"isMale":false,"hobbies":["明星","神雕侠侣"]},{"name":"林耀东","age":45,"isMale":true,"hobbies":["村支书","破冰行动"]}]
但是,将Json字符串转换为List对象的时候,就有一点不同了。
由于List接口带泛型,如果还调用 t fromJson(String, Class)方法,那么返回的虽然还是个List集合,但是集合里面的数据却不是Person对象,而是Map对象,并将Person属性以键值对的形式存放在Map的实例中。如下:
// 先准备一个List集合
List<Person> list = new ArrayList<>();
list.add(new Person("刘亦菲", 16, false, Arrays.asList("明星", "神雕侠侣")));
list.add(new Person("林耀东", 45, true, Arrays.asList("村支书", "破冰行动")));
// 创建Gson实例
Gson gson = new Gson();
// 调用Gson的toJson方法
String listJson = gson.toJson(list);
List fromJson = gson.fromJson(listJson, List.class);
System.out.println(fromJson.get(0).getClass());
打印结果:
class com.google.gson.internal.LinkedTreeMap
要想获取的之前的Lis,那么我们需要调用Gson的 T fromJson(String, Type) 方法。如下:
此方法参数中的Type类型可以通过Gson包提供TypeToken<>类获取。这个类带有泛型,且这个泛型就是Json串转换成为对象后的类型(此处是List)我们不需要重写这个类中的任何方法,只需要创建这个类的一个匿名内部类并调用getTpye()方法即可。
注意:一定要将这个匿名内部类的泛型写为Json字符串解析后生成的对象类型。
// 先准备一个List集合
List<Person> list = new ArrayList<>();
list.add(new Person("刘亦菲", 16, false, Arrays.asList("明星", "神雕侠侣")));
list.add(new Person("林耀东", 45, true, Arrays.asList("村支书", "破冰行动")));
// 创建Gson实例
Gson gson = new Gson();
// 调用Gson的toJson方法
String listJson = gson.toJson(list);
// 调用Gson的 T fromJson(String, Type)将List集合的json串反序列化为List对象
List<Person> plist = gson.fromJson(listJson, new TypeToken<List<Person>>(){}.getType());
System.out.println(plist);
打印结果:
[Person{name='刘亦菲', age=16, isMale=false, hobbies=[明星, 神雕侠侣]}, Person{name='林耀东', age=45, isMale=true, hobbies=[村支书, 破冰行动]}]
转换Map的步骤就和转换List的步骤一模一样了,代码如下。详解请看List转换。
Map<String, Person> map = new HashMap<>();
map.put("p1", new Person("刘亦菲", 16, false, Arrays.asList("明星", "神雕侠侣")));
map.put("p2", new Person("林耀东", 45, true, Arrays.asList("村支书", "破冰行动")));
Gson gson = new Gson();
String mapJson = gson.toJson(map);
System.out.println("打印出来的mapJson是:"+mapJson);
Map<String, Person> jsonMap = gson.fromJson(mapJson, new TypeToken<Map<String, Person>>() { }.getType());
System.out.println("打印出来的jsonMap是:"+jsonMap);
打印结果:
打印出来的mapJson是:{"p1":{"name":"刘亦菲","age":16,"isMale":false,"hobbies":["明星","神雕侠侣"]},"p2":{"name":"林耀东","age":45,"isMale":true,"hobbies":["村支书","破冰行动"]}}
打印出来的jsonMap是:{p1=Person{name='刘亦菲', age=16, isMale=false, hobbies=[明星, 神雕侠侣]}, p2=Person{name='林耀东', age=45, isMale=true, hobbies=[村支书, 破冰行动]}}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。