fastjson解析出现引用问题

2023-05-16

1.问题描述

 后端返回前端接口数据包含引用数据,如下图所示

 2.原因

转json时使用这种方式,fastjson自动使用循环引用:

String content = JSONObject.toJSONString(object);
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

3.fastjson的循环引用

当一个对象包含另一个对象时,fastjson就会把该对象解析成引用。引用是通过$ref标示的,下面介绍一些引用的描述
"$ref":".." 上一级
"$ref":"@" 当前对象,也就是自引用
"$ref":"$" 根对象
"$ref":"$.children.0" 基于路径的引用,相当于 root.getChildren().get(0)

4.解决方案

对象转为json

String content = JSONObject.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

json解析为对象,两个方式

1.全局配置

package com.flowpp.citylights.detection.config;

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * ps: 不能同时存在WebMvcConfigurationSupport和WebMvcConfigurer
 * 否则会导致继承WebMvcConfigurationSupport的配置类失效
 *
 * @description mvc配置
 **/
@Component
public class WebMvcConfig extends WebMvcConfigurationSupport {

   
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

        //先干掉jackson
        Iterator<HttpMessageConverter<?>> iterator = converters.iterator();
        while (iterator.hasNext()) {
            HttpMessageConverter<?> converter = iterator.next();
            if (converter instanceof MappingJackson2HttpMessageConverter) {
                iterator.remove();
            }
        }

        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        //自定义配置...
        FastJsonConfig config = new FastJsonConfig();
        config.setDateFormat("yyyy-MM-dd HH:mm:ss");
        config.setCharset(StandardCharsets.UTF_8);
        config.setSerializerFeatures(
        //禁止循环引用和重复引用
                SerializerFeature.DisableCircularReferenceDetect,
                SerializerFeature.WriteMapNullValue,
                SerializerFeature.PrettyFormat,
                SerializerFeature.WriteNullListAsEmpty,
                SerializerFeature.WriteNullStringAsEmpty
        );
        converter.setFastJsonConfig(config);

        List<MediaType> fastMediaType = new ArrayList<>();
        MediaType mediaType = MediaType.parseMediaType("text/html;charset=UTF-8");
        fastMediaType.add(mediaType);
        fastMediaType.add(MediaType.APPLICATION_JSON);
        converter.setSupportedMediaTypes(fastMediaType);

        converters.add(0, converter);
    }
}

2.局部配置

在属性上添加注解

    /**
     * 控制范围
     */
    @JSONField(serialzeFeatures = SerializerFeature.DisableCircularReferenceDetect)
    private List<Integer> controlRange;

 以上都配置完成了之后,我们项目仍然不生效,这是最让人纠结的事,为此郁闷了一天。翻看了网上所有资料,这种配置都没有问题,因此查看了fastjson的最新版本和项目中版本对比。一般会选择使用者较多且较新的版本。我们项目使用的是2.0.6版本,这个是dubbo-spring-boot-starter的2.7.8版本自动引用的,挺坑人的。换个fastjson的2.0.7版本就好使了。又是开心的一天~

      <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.7</version>
        </dependency>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fastjson解析出现引用问题 的相关文章

随机推荐

  • Android JNI/NDK C++代码读写手机上存放的文件

    Android JNI NDK C 43 43 代码读写手机上存放的文件 xff08 1 xff09 首先确保当前app已经获得读文件系统的权限 xff1a lt uses permission android name 61 34 and
  • kotlin,null let expression

    kotlin null let expression class Num var data Int 61 1 fun main args Array lt String gt val n 61 Num n data 61 null var
  • Unable to make field private final java.lang.String java.io.File.path accessible: module java.base d

    Android Studio编译报错 xff1a Unable to make field private final java lang String java io File path accessible module java ba
  • Android 引入hunter-debug监测代码运行时函数耗时和参数及返回值,Java(1)

    Android 引入hunter debug监测代码运行时函数耗时和参数及返回值 xff0c Java xff08 1 xff09 xff08 1 xff09 在工程的根build gradle文件里面添加cn quinnchen hunt
  • 阅读笔记-软件工程的大泥球

    软件工程的大泥球 xff08 原文地址 xff1a http www laputan org mud xff09 大泥球的定义 xff1a A BIG BALL OF MUD is a casually even haphazardly s
  • Android 引入hunter-timing监测UI主线程函数运行时耗时,Java(2)

    Android 引入hunter timing监测UI主线程函数运行时耗时 xff0c Java xff08 2 xff09 xff08 1 xff09 在工程的根build gradle文件配置 xff1a buildscript rep
  • 无人驾驶项目——交通标志识别

    在无人驾驶项目中 xff0c 实现交通标志识别是一项重要工作 本文以德国交通标志数据集为训练对象 xff0c 采用深度神经网络LeNet架构处理图像 xff0c 实现交通标志识别 具体处理过程包括包括 xff1a 数据导入 探索和可视化数据
  • SO_RCVBUFFORCE

    mytcp sockets allocated是到目前为止 xff0c 整个tcp协议中创建的socket的个数 xff0c 由mytcp prot的成员 sockets allocated指向 可以在 proc net sockstat文
  • n个球放k个盒子问题归纳

    问题描述 xff1a 有n个球 xff0c 放进k个盒子 xff0c 有多少种不同的放法 xff1f xff08 球必须全部放在盒子中 xff0c 不能丢弃 xff09 球可能相同 xff0c 也可能不同 xff0c 盒子亦然 另外 xff
  • Python模拟登录CSDN

    关于CSDN的模拟登录 xff0c 网上已经有相当一部分博主发过类似的文章 xff0c 我这里不过稍稍模仿下 xff0c 使用前辈们的经验时 xff0c 还是非常感激的 具体过程如下 xff1a xff08 1 xff09 确定登录页面的表
  • 【UNIX环境高级编程】UNIX基础知识

    UNIX环境高级编程 UNIX基础知识 1 UNIX体系结构 从严格意义上 xff0c 可将操作系统定义为一种软件 xff0c 它控制计算机硬件资源 xff0c 提供程序运行环境 xff0c 我们称这种软件为内核 内核的接口称为系统调用 公
  • postman能正常打开但不显示窗口

    1 最近使用postman偶尔出现以下问题 postman在任务栏能正常打开 xff0c 如下图 xff0c 使用Alt 43 Tab也能看到 xff0c 但是窗口就是显示不了 2 解决方案 将鼠标放在任务栏上 xff0c 使用快捷键Alt
  • Linux文件相关常用命令(超全超详细)

    目录 command终端命令格式 xff1a command options parameter 1 ls命令 2 cd命令 3 touch 命令 4 mkdir命令 5 pwd命令 6 clear 命令 7 rm命令 8 cp命令 9 m
  • Linux远程管理常用命令(超全超详细)【持续更新】

    目录 1 shutdown命令 2 ifconfig命令 3 uname命令 4 uptime命令 5 free命令 6 who命令 7 last命令 8 history命令 9 ping命令 10 chmod 命令 11 chown 命令
  • 基于springcloud 的Eureka的服务注册与发现

    1 注册中心用来管理每个服务与服务之间的依赖关系 xff08 服务治理 xff09 xff0c 存放服务地址相关信息 xff08 接口地址 xff09 2 服务提供者 xff1a 提供服务接口 3 服务消费者 xff1a 调用服务接口 4
  • 计算机系统层次存储结构

    问 xff1a 当前计算机系统一般会采用层次结构存储数据 xff0c 请介绍下典型计算机存储系统一般分为哪几个层次 xff0c 为什么采用分层存储数据能有效提高程序的执行效率 xff1f 所谓存储系统的层次结构 xff0c 就是把各种不同存
  • Springboot的cache缓存机制

    我们知道一个程序的瓶颈在于数据库 xff0c 我们也知道内存的速度是大大快于硬盘的速度的 当我们需要重复地获取相同的数据的时候 xff0c 我们一次又一次的请求数据库或者远程服务 xff0c 导致大量的时间耗费在数据库查询或者远程方法调用上
  • Python-异常处理+文件

    目录 1 异常处理 1 简单的异常捕获 2 捕获错误类型 3 捕获未知错误 4 完整的异常语法 5 异常的传递 6 抛出异常 2 文件 1 读取文件 2 读取文件后文件指针会改变 3 写入文件 4 分行读取文件 5 复制文件 6 复制大文件
  • Eureka的设计理念

    目录 1 概述 1 1 服务实例如何注册到服务中心 1 2服务实例如何从服务中心剔除 1 3 服务实例信息的一致性问题 2 AP优于CP 3 Peer to Peer架构 3 1 主从复制 3 2 对等复制 4 Zone及Region设计
  • fastjson解析出现引用问题

    1 问题描述 后端返回前端接口数据包含引用数据 xff0c 如下图所示 2 原因 转json时使用这种方式 xff0c fastjson自动使用循环引用 xff1a String content 61 JSONObject toJSONSt