FastJson中“$ref 循環引用檢測”的問題

今天在測試時,錯誤停留在了以下的代碼行

Object object = new ObjectMapper().readValue(JSON.toJSONString(procInst.getForm()), Object.class);


報錯信息:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "$ref"

查看錯誤日志,發現是阿里巴巴的Fastjson在轉換數據出現的錯誤,錯誤中提到了$ref,了解了一下是因為在傳輸的數據中出現相同的對象時,fastjson默認開啟引用檢測將相同的對象寫成引用的形式 默認開啟引用檢測將相同的對象寫成引用的形式。

舉個例子:

JSONObject obj = new JSONObject();
obj.put("obj", "111");JSONObject a = new JSONObject();
a.put("id", "a");
a.put("obj", obj);JSONObject b = new JSONObject();
b.put("id", "b");
b.put("obj", obj);JSONObject c = new JSONObject();
c.put("a", a);
c.put("b", b);System.out.println(c);
//{"a":{"id":"a","obj":{"obj":"111"}},"b":{"id":"b","obj":{"$ref":"$.a.obj"}}}System.out.println(JSON.toJSONString(c, SerializerFeature.DisableCircularReferenceDetect));
//{"a":{"id":"a","obj":{"obj":"111"}},"b":{"id":"b","obj":{"obj":"111"}}}

JSON.toJSONString使用的是com.alibaba.fastjson.JSON(錯誤發生在這里)
ObjectMapper使用的是jackson

親測幾種解決方式:

一、改為強轉:Object object = (Object)procInst.getForm();

二、使用jackson來解析為字符:new ObjectMapper().writeBalueAsString(procInst.getForm());

三、局部關閉,使用SerializerFeature.DisableCircularReferenceDetect關閉循環引用:Object object = new ObjectMapper().readValue(JSON.toJSONString(procInst.getForm(), SerializerFeature.DisableCircularReferenceDetect), Object.class);

四、全局關閉,在SpringBoot項目的json配置中將循環引用關閉。FastJson的配置增加:fastConverter.setFeatures(SerializerFeature.DisableCircularReferenceDetect);

五、在字段的注解上,指定序列化關閉循環引用:
@JSONField(serialzeFeatures = {SerializerFeature.DisableCircularReferenceDetect})
private List<Object> objectList;

六、禁止序列化(但實際是要用的,沒辦法,不用的話可以禁用)
@JSONField(serialize = false)
private List<Order> orderList;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715462.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715462.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715462.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux命令行與shell腳本大全——學習筆記(1-4章)

第一章、第二章 查看運行層級 runlevel 目前有7個層級&#xff0c;3是有聯網的多用戶模式&#xff0c;5是配有GUI的多用戶模式&#xff0c;等等 第三章 啟動shell 查看/etc/passwd文件&#xff0c;可以看到每個用戶的默認shell程序&#xff0c;如: christine:x:1001:1001:…

面條機水箱低液位提醒功能如何實現

光電液位傳感器在面條機水箱低液位功能的實現中發揮著重要作用。該技術通過光學原理和分離式設計&#xff0c;實現了面條機水箱液位的精準檢測和智能控制&#xff0c;為面條生產提供了穩定的保障。 采用分離式液位傳感器&#xff0c;將菱鏡部分設計直接置于面條機水箱上&#…

nvidia a100-pcie-40gb環境安裝

1.conda create --name torch_li python3.8 2. conda install pytorch1.7.1 torchvision0.8.2 torchaudio0.7.2 cudatoolkit11.0 -c pytorch 環境測試&#xff1a;torch.cuda.is_available() 3.conda remove -n torch_li --all 4.pip install opencv-python-headless 5.pip ins…

SOCKS55代理與Http代理有何區別?如何選擇?

在使用IPFoxy全球代理時&#xff0c;選擇 SOCKS55代理還是HTTP代理&#xff1f;IPFoxy代理可以SOCKS55、Http協議自主切換&#xff0c;但要怎么選擇&#xff1f;為解決這個問題&#xff0c;得充分了解兩種代理的工作原理和配置情況。 在這篇文章中&#xff0c;我們會簡要介紹 …

overleaf上傳到arxiv 參考文獻無法引用(?)

記一下overleaf上傳到arxiv的bug 參考文獻無法引用&#xff08;&#xff1f;&#xff09; 因為需要上傳bbl文件而不是bib 用overleaf生成bbl 另外需要將bbl和txt的文件名設置成一樣的

Linux筆記--解壓縮

一、tar指令 Linux打包文件通常以.tar結尾&#xff0c;壓縮文件以.gz(.bz2)結尾。通常壓縮和打包是一起進行的&#xff0c;打包壓縮后文件后綴名一般為.tar.gz。 z∶使用gzip進行解壓縮 j:使用bzip2進行解壓縮 c: create&#xff0c;創建文件 x : extract&#xff0c;解壓 v:…

RocketMQ消息積壓如何處理

在高并發的場景下&#xff0c;由于消息產生速度超過消費速度&#xff0c;可能會導致消息積壓的問題。本文將介紹 RocketMQ 消息積壓的原因和如何處理積壓問題。 什么是消息積壓 消息積壓是使用 MQ 消息隊列系統中&#xff0c;最常見的一種性能問題。如下圖所示&#xff0c;當生…

2、Redis-Hash【常用】

目錄 一、Hash和String的區別 二、常用命令與演示 三、Redis中Hash類型應用場景 一、Hash和String的區別 這是String, keyvaluenameTrxcx 這是Hash&#xff0c; keyvaluestudentTrxcxnameTrxcxage21sexmale 可以明顯的看出&#xff0c;String的value就是一條數據&#…

手動實現一個簡單的 HTTP 請求

本文我們通過 Socket&#xff0c;寫一個 HTTP 協議&#xff0c;直觀的感受一下上篇文章中的請求和響應。 定義 socket server 通過上篇文章&#xff0c;我們知道 HTTP 協議底層是通過 Socket 實現的&#xff0c;所以我們先通過 socket 定義一個 server import socket#初始化 …

復試PAT乙級day34

1111~1115 1113 很難&#xff0c;看了題解 人類習慣用 10 進制&#xff0c;可能因為大多數人類有 10 根手指頭&#xff0c;可以用于計數。這個世界上有一種叫“錢串子”&#xff08;學名“蚰蜒”&#xff09;的生物&#xff0c;有 30 只細長的手/腳&#xff0c;在它們的世界里…

【探索AI】十六 深度學習之第2周:深度神經網絡(五)實踐與應用

實踐與應用 實現步驟 當您想要使用深度學習框架構建簡單的深度神經網絡并進行訓練與評估時&#xff0c;您可以按照以下步驟進行操作&#xff1a; 步驟一&#xff1a;選擇深度學習框架 選擇您熟悉或希望學習的深度學習框架&#xff0c;比如TensorFlow、PyTorch、Keras等。 …

算法題目跟連系列之“手把手刷鏈表”

第一道 題目&#xff1a;https://leetcode.cn/problems/partition-list/description/ 86 Partition List 這個題解決的時候&#xff0c;無非就是把鏈表中小于X的元素摘出來形成一個鏈表&#xff0c;同時也把大于等于X的元素摘出來形成另外一個鏈表。最后把這兩個鏈表合并。這個…

卷積神經網絡介紹

卷積神經網絡(Convolutional Neural Networks&#xff0c;CNN) 網絡的組件&#xff1a;卷積層&#xff0c;池化層&#xff0c;激活層和全連接層。 CNN主要由以下層構造而成&#xff1a; 卷積層&#xff1a;Convolutional layer&#xff08;CONV&#xff09;池化層&#xff1a…

docker報錯 fatal error: runtim: out of memory

fatal error: runtim: out of memory 真無語了 系統內存也夠用 原來是虛擬機的不夠用了 &#xff08;原本1g已經加到2g還是會報錯&#xff09; 直接3臺虛擬機都加到4g

多線程(進階四:線程安全的集合類)

目錄 一、多線程環境使用ArrayList 二、多線程環境使用隊列 三、多線程環境使用哈希表 1、HashMap 2、Hashtable 3、ConcurrentHashMap (1)縮小了鎖的粒度 (2)充分使用了CAS原子操作&#xff0c;減少一些加鎖 (3)針對擴容操作的一些優化&#xff08;化整為零&#xff…

maven 項目的創建入門

拓展閱讀 maven 包管理平臺-01-maven 入門介紹 Maven、Gradle、Ant、Ivy、Bazel 和 SBT 的詳細對比表格 maven 包管理平臺-02-windows 安裝配置 mac 安裝配置 maven 包管理平臺-03-maven project maven 項目的創建入門 maven 包管理平臺-04-maven archetype 項目原型 ma…

藍橋杯Python B組練習——python復習2

藍橋杯Python B組練習——python復習2 一、簡介 復習python&#xff0c;參考書《Python編程從入門到實踐》&#xff0c;[美]Eric Mathes著。前一部分見專欄——藍橋杯Python B組練習 這一部分不全&#xff0c;不想寫了 二、字典 1.一個簡單的字典 來看一個游戲&#xff0…

LeetCode -55 跳躍游戲

LeetCode -55 跳躍游戲 給你一個非負整數數組 nums &#xff0c;你最初位于數組的 第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。 判斷你是否能夠到達最后一個下標&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。…

模擬服務器響應的測試框架:moco

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;在這篇博客中&#xff0c;咱們要聊聊Moco測試框架。這個框架&#xff0c;可不是一般的小伙伴&#xff0c;它在模擬服務器響應這塊兒&#xff0c;可是有不少看家本領。 首先&#xff0c;Moco是啥呢&#xff1f;簡…

stable diffusion webUI之賽博菩薩【秋葉】——工具包新手安裝與使用教程

stable diffusion webUI之賽博菩薩【秋葉】——工具包新手安裝與使用教程 AI浪潮襲來&#xff0c;還是學習學習為妙賽博菩薩【秋葉】簡介——&#xff08;葉ye&#xff0c;四聲&#xff0c;同葉&#xff09;A繪世啟動器.exe&#xff08;sd-webui-aki-v4.6.x&#xff09;工具包安…