当前位置:   article > 正文

Fastjson和Gson_gson和fastjson

gson和fastjson

Fastjson

1、什么是Fastjson

  1. Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
  2. Fastjson 源码地址:https://github.com/alibaba/fastjson
  3. Fastjson 中文 Wiki:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN

2、下载和使用

  1. maven仓库:https://repo1.maven.org/maven2/com/alibaba/fastjson/
    2.maven 依赖
		<!-- Fastjson 不指定版本号会报错-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3、实际运用

创建实体类: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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

(1)对象与字符串之间的互转

①对象转化为字符串

	@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);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

打印结果:

转化后的字符串是:{"age":12,"dateOfBirth":1653734705701,"fullName":"会儿物管费"}
  • 1

②字符串转化为对象

	@Test
    public void test2() {
        String personStr = "{\"age\":12,\"dateOfBirth\":1653727927858,\"fullName\":\"会儿物管费\"}";
        Person person = JSON.parseObject(personStr, Person.class);
        System.out.println("打印出来的实体是:"+person);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

打印结果:

打印出来的实体是:Person(age=12, fullName=会儿物管费, dateOfBirth=Sat May 28 16:52:07 CST 2022)
  • 1

(2)map与json字符串之间互转

①json字符串转map

		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());
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

打印结果:

打印出来的map是:{"fullName":"会儿物管费","dateOfBirth":1653727927858,"age":12}
key值是:fullName value值是:会儿物管费
key值是:dateOfBirth value值是:1653727927858
key值是:age value值是:12
  • 1
  • 2
  • 3
  • 4

②map转json

		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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

打印结果:

打印出来的map是:{fullName=刘诗诗, dateOfBirth=Sat May 28 23:31:23 CST 2022, age=18}
打印出来的json是:{"fullName":"刘诗诗","dateOfBirth":1653751883779,"age":18}
  • 1
  • 2

Gson

1、什么是Gson

Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,
但自从在2008年五月公开发布第一版后已被许多公司或用户应用。

Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。

而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。
类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。

2、下载和使用

第一步:导入依赖

目前,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>
  • 1
  • 2
  • 3
  • 4
  • 5

第二步:开始使用

在开发中,Json转换的场景往往也就是那么几个。

  1. 将JavaBean转换为json,或将json字符串转换为JavaBean。
  2. 将List集合转换为json,或将json转换为List集合。
  3. 将Map集合转换为json,或将json转换为Map集合。
使用场景一:转换普通对象(Bean)
  • (1)将普通的JavaBean转换为Json字符串是最常用的操作了,首先创建一个简单的类,例如:Person。
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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • (2) 使用Gson解析Person的实例。
    1.先创建Person对象。
    2.在创建Gson对象。
    3.调用Gson的String toJson(Object)方法,来将对象转换为json字符串。
		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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

打印结果:

{"name":"刘亦菲","age":16,"isMale":false,"hobbies":["明星","神雕侠侣"]}
  • 1
  • (3)将Person实例的json字符串转换为Person对象。
    调用Gson的 t fromJson(String, Class)方法,将Json串转换为对象
		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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

打印结果:

Person{name='刘亦菲', age=16, isMale=false, hobbies=[明星, 神雕侠侣]}
  • 1
使用场景二:转换List集合。

大致步骤和转换普通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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

打印结果:

[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":["村支书","破冰行动"]}]
  • 1
  • 2

但是,将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());
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

打印结果:

class com.google.gson.internal.LinkedTreeMap
  • 1

要想获取的之前的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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

打印结果:

[Person{name='刘亦菲', age=16, isMale=false, hobbies=[明星, 神雕侠侣]}, Person{name='林耀东', age=45, isMale=true, hobbies=[村支书, 破冰行动]}]
  • 1
使用场景三:转换Map集合。

转换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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

打印结果:

打印出来的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=[村支书, 破冰行动]}}
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/834192
推荐阅读
相关标签
  

闽ICP备14008679号