image-20220322210719151

1.引入POM

      <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.79</version>
        </dependency> 

2.核心API

序列化

String json=Json.toJSONString(XX,true);

反序列化

    // json转换为对象格式
    XXX对象 json=Json.parseObject(json数据,转换对象的class对象)

    // json转换为数组格式
    /**
     * @param String text-转换的json字符串
     * @param Class<T> clazz-集合转换后泛型的class对象
     */
    List<User> user = JSON.parseArray(json, User.class);


    // 直接反序列化成为map集合,map集合的没有泛型,否则就会报错
    Map map = JSON.parseObject(json);
	
    // 直接进反序列化,map集合是没有泛型的,没有泛型的集合是不安全的集合
    // 转换后的集合必须有泛型
    // 调用parseObject,传递参数,TypeRefernces类型,在TypeReference的泛型中,传递转换后的map集合
    Map<String, User> map = JSON.parseObject(json, new TypeReference<Map<String, User>>() {

    });

3,案例Demo

3.1序列化操作

3.1.1Object转换为JSON
/**
   * 描述:object2 json
   */
  @Test
  public void object2JSON() {
    User user = new User();
    user.setId("1");
    user.setUsername("茅斐宇");
    user.setAge(0);
    user.setBirthday(LocalDateTime.now());
    user.setTime(new Date());
    user.setEmail("157@qq.com");

    // 利用fastjson将user进行序列化成为json字符串
    String json = JSON.toJSONString(user, true);
    System.out.println(json);
  }
3.1.2集合转换为JSON

list集合中的一个对象为数组中的一个对象


/**
   * 描述:List集合转换成为json
   */
  @Test
  public void list2JSON() {
    ArrayList<User> list = new ArrayList<>();
    User user = new User();
    user.setId("1");
    user.setUsername("茅斐宇");
    user.setAge(0);
    user.setBirthday(LocalDateTime.now());
    user.setTime(new Date());
    user.setEmail("157@qq.com");
    User user2 = new User();
    user2.setId("22222");
    user2.setUsername("茅斐12312宇");
    user2.setAge(0);
    user2.setBirthday(LocalDateTime.now());
    user2.setTime(new Date());
    user2.setEmail("13123132157@qq.com");
    list.add(user2);
    list.add(user);

    // 转JSON
    String json = JSON.toJSONString(list, true);
    System.out.println(json);
  }
2.2.3Map转换为JSON

转换后,map的key当做我们json的key


  /**
   * 描述:map集合转换成为json
   */
  @Test
  public void map2JSON() {
    HashMap<String, User> map = new HashMap<>();
    User user = new User();
    user.setId("1");
    user.setUsername("茅斐宇");
    user.setAge(0);
    user.setBirthday(LocalDateTime.now());
    user.setTime(new Date());
    user.setEmail("157@qq.com");
    User user2 = new User();
    user2.setId("22222");
    user2.setUsername("茅斐12312宇");
    user2.setAge(0);
    user2.setBirthday(LocalDateTime.now());
    user2.setTime(new Date());
    user2.setEmail("13123132157@qq.com");
    map.put("one", user);
    map.put("two", user2);

    // 转JSON
    String json = JSON.toJSONString(map, true);
    System.out.println(json);
  }

3.2反序列化操作

3.2.1JSON转换为对象
@Test
  public void json2Object() throws Exception {
    String json = "{\n" +
        "\t\"age\":0,\n" +
        "\t\"birthday\":\"2022-03-15T08:23:49.941\",\n" +
        "\t\"email\":\"157@qq.com\",\n" +
        "\t\"id\":\"1\",\n" +
        "\t\"time\":1647303829941,\n" +
        "\t\"username\":\"茅斐宇\"\n" +
        "}";
    User user = JSON.parseObject(json, User.class);

    System.out.println(user);
  }

3.2.2JSON转换为List
@Test
  public void json2List() throws Exception {
    String json = "[\n" +
        "\t{\n" +
        "\t\t\"age\":0,\n" +
        "\t\t\"birthday\":\"2022-03-15T08:25:09.826\",\n" +
        "\t\t\"email\":\"13123132157@qq.com\",\n" +
        "\t\t\"id\":\"22222\",\n" +
        "\t\t\"time\":1647303909826,\n" +
        "\t\t\"username\":\"茅斐12312宇\"\n" +
        "\t},\n" +
        "\t{\n" +
        "\t\t\"age\":0,\n" +
        "\t\t\"birthday\":\"2022-03-15T08:25:09.824\",\n" +
        "\t\t\"email\":\"157@qq.com\",\n" +
        "\t\t\"id\":\"1\",\n" +
        "\t\t\"time\":1647303909826,\n" +
        "\t\t\"username\":\"茅斐宇\"\n" +
        "\t}\n" +
        "]";
    /**
     * @param String text-转换的json字符串
     * @param Class<T> clazz-集合转换后泛型的class对象
     */
    List<User> user = JSON.parseArray(json, User.class);

    System.out.println(user);
    user.stream().forEach(System.out::println);

  }

2.3.3JSON转换为Map<String,XXX>
@Test
public void json2Map() {
   String json = "{\n" +
         "\t\"one\":{\n" +
         "\t\t\"age\":0,\n" +
         "\t\t\"birthday\":\"2022-03-15T08:35:39.091\",\n" +
         "\t\t\"email\":\"157@qq.com\",\n" +
         "\t\t\"id\":\"1\",\n" +
         "\t\t\"time\":1647304539091,\n" +
         "\t\t\"username\":\"茅斐宇\"\n" +
         "\t},\n" +
         "\t\"two\":{\n" +
         "\t\t\"age\":0,\n" +
         "\t\t\"birthday\":\"2022-03-15T08:35:39.091\",\n" +
         "\t\t\"email\":\"13123132157@qq.com\",\n" +
         "\t\t\"id\":\"22222\",\n" +
         "\t\t\"time\":1647304539091,\n" +
         "\t\t\"username\":\"茅斐12312宇\"\n" +
         "\t}\n" +
         "}\n";

   // 直接进反序列化,map集合是没有泛型的,没有泛型的集合是不安全的集合
   // 转换后的集合必须有泛型
   // 调用parseObject,传递参数,TypeRefernces类型,在TypeReference的泛型中,传递转换后的map集合
   Map<String, User> map = JSON.parseObject(json, new TypeReference<Map<String, User>>() {

   });


   System.out.println(map);
   }

4.SerializerFeature枚举

Fastjson默认不会序列化空值得属性,我们 可以在方法参数上添加枚举的类型,来进行序列化操作(默认值为null)

	SerializerFeature.WriteMapNullValue 默认使用null进行赋值
    SerializerFeature.WriteNullStringAsEmpty 默认使用""进行赋值
    SerializerFeature.WriteNullNumberAsZero 默认将null序列化为0
    SerializerFeature.WriteNullBooleanAsFalse 默认boolen为null,序列化为false 
    SerializerFeature.WriteDateUseDateFormat 日期格式化
    SerializerFeature.PrettyFormat 格式化json字符串
/**
   * SerializerFeature 枚举:进行序列化时,可以自己定义特殊的需求
   * JSON静态方法,toJSONString()
   * 方法的参数:第一个要序列化的对象
   * 方法的参数:第二个参数SerializerFeature枚举类型的可变参数
   * SerializerFeature枚举的敞亮,做序列化的个性需求
   */

/**
 * fastjson默认不会序列化空值
 */
@Test
public void test() {
   User user = new User();
   user.setId("");
   user.setAge(0);
   user.setBirthday(LocalDateTime.now());
   user.setEmail("");
   // 在方法的参数上,添加枚举类型SerializerFeature.WriteMapNullValue
   String s = JSON.toJSONString(user, SerializerFeature.WriteMapNullValue);
   System.out.println(s);
}

5.FastJson注解

5.1@JSONField注解

该注解作用于方法,字段和参数上,可以在序列化和反序列时进行特性功能定制

  • name:序列化后的名字
  • ordinal:序列化后的顺序(默认0,越小制度啦越靠前)
  • format:序列化后的格式
  • serialize:是否序列化该字段
  • deserialilze:是否反序列化该字段
  • serialzeFeature:序列化的特性定义(同上)
  @JSONField(name = "id", ordinal = 0, format = "yyyy-MM-dd", serialize = true, deserialize = true)

5.2@JSONType注解

该注解作用于类上,对该字段进行序列化和反序列化的特性功能定制

  • indudes:要被序列化的字段
  • orders:序列化后的顺序
  • serialzeFeatures:序列化的特性定义
@JSONType(includes = {"id", "name", "age"},orders = {"id", "name"})

6.SpringBoot整合FastJson

6.1排除Jackson依赖

		 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-json</artifactId>
                    <groupId>org.springframework.boot</groupId>
                </exclusion>
            </exclusions>
        </dependency>

6.2添加Fastjson依赖

<!-- fastjson -->
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.79</version>
</dependency>

6.3配置Fastjson

6.3.1方式1:注入bean
  /**
   * 描述:
   * 覆盖方法configureMessageConverters,使用fastJson
   *
   * @return {@link HttpMessageConverters }
   */
  @Bean
  public HttpMessageConverters fastJsonHttpMessageConverters() {
    //1、定义一个convert转换消息的对象
    FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
    //2、添加fastjson的配置信息
    FastJsonConfig fastJsonConfig = new FastJsonConfig();
    fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
    //3、在convert中添加配置信息
    fastConverter.setFastJsonConfig(fastJsonConfig);
    // 设置编码字符集
    fastJsonConfig.setCharset(Charset.forName("UTF-8"));
    //3.解决乱码问题。定义响应的MIME类型,设置响应的content-type为application/json;charset=UTF-8
    List<MediaType> fastMediaType = new ArrayList<>();
    fastMediaType.add(MediaType.APPLICATION_JSON_UTF8);
    
    //4、将convert添加到converters中
    HttpMessageConverter<?> converter = fastConverter;
    return new HttpMessageConverters(converter);
  }
6.3.2方式2:重写configureMessageConverters()方法

启动类实现org.springframework.web.servlet.config.annotation.WebMvcConfigurer接口
重写public void configureMessageConverters(List<HttpMessageConverter<?>> converters)方法

/**
   * 描述:配置消息转换器
   *  1.json序列化美化
   *  2.设置编码集为UTF-8
   *  
   * @param converters 转换器
   */
  @Override
  public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

    //1、定义一个convert转换消息的对象
    FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
    //2、添加fastjson的配置信息
    FastJsonConfig fastJsonConfig = new FastJsonConfig();
    // 设置序列化美化
    fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
    // 设置编码字符集
    fastJsonConfig.setCharset(Charset.forName("UTF-8"));
    //3、在convert中添加配置信息
    fastConverter.setFastJsonConfig(fastJsonConfig);

    //3.解决乱码问题。定义响应的MIME类型,设置响应的content-type为application/json;charset=UTF-8
    List<MediaType> fastMediaType = new ArrayList<>();
    fastMediaType.add(MediaType.APPLICATION_JSON_UTF8);
    //4.converter消息转换器添加配置信息
    fastConverter.setSupportedMediaTypes(fastMediaType);

    //4、将convert添加到converters中
    converters.add(fastConverter);
  }

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐