使用Jackson TypeFactory实现Java泛型列表反序列化

使用Jackson TypeFactory实现Java泛型列表反序列化

本文旨在解决java中利用jackson库进行泛型列表反序列化时遇到的类型擦除问题。通过深入探讨`typereference`的局限性,我们引入了`typefactory`,特别是`constructcollectiontype`方法,来动态构建运行时类型信息。文章提供了详细的示例代码,展示了如何创建一个通用的方法,能够灵活地将json数据反序列化为任何指定类型的对象列表,并建议使用`inputstream`以增强方法的通用性。

在Java开发中,我们经常需要将JSON数据反序列化为特定类型的对象列表。当面对多种不同的对象类型(例如List和List)时,为每种类型编写一个单独的反序列化方法会导致代码重复和维护困难。理想情况下,我们希望创建一个泛型方法来处理所有类型的列表反序列化。

问题分析:泛型擦除与TypeReference的局限性

考虑以下场景:我们有两个模型类A和B,并希望将对应的JSON文件反序列化为List和List

class A {}class B {}public class MainClass {    public static void main(String[] args) throws IOException {        String aJsonPath = "path/to/a.json";        List aList = readAJsonAsList(aJsonPath);        String bJsonPath = "path/to/b.json";        List bList = readBJsonAsList(bJsonPath);    }    // 方法 for A    private static List readAJsonAsList(String jsonAFile) throws IOException {        ObjectMapper omA = new ObjectMapper();        List aList = omA.readValue(new File(jsonAFile), new TypeReference<ArrayList>() {});        return aList;    }    // 方法 for B    private static List readBJsonAsList(String jsonBFile) throws IOException {        ObjectMapper omB = new ObjectMapper();        List bList = omB.readValue(new File(jsonBFile), new TypeReference<ArrayList>() {});        return bList;    }}

上述代码中,readAJsonAsList和readBJsonAsList方法结构高度相似,仅泛型参数不同。为了实现代码复用,我们可能会尝试创建一个泛型方法:

// 尝试的泛型方法private static  List readJsonAsList(String jsonFile) throws IOException {    ObjectMapper objectMapper = new ObjectMapper();    // 这种方式不会生效    List list = objectMapper.readValue(new File(jsonFile), new TypeReference<ArrayList>() {});    return list;}

然而,上述尝试的泛型方法并不能正确工作。其核心原因在于Java的类型擦除机制。在运行时,泛型类型参数T的信息会被擦除,TypeReference<ArrayList>在运行时无法获取到T的具体类型。TypeReference的工作原理是利用匿名内部类来捕获泛型类型信息,但这要求泛型参数在编译时是确定的具体类型(例如A或B),而不是一个泛型类型参数T。因此,Jackson无法在运行时知道T到底代表什么类型,从而导致反序列化失败或行为异常。

立即学习“Java免费学习笔记(深入)”;

解决方案:利用Jackson TypeFactory动态构建类型

要解决类型擦除问题,我们需要在运行时向Jackson提供泛型类型T的具体Class对象。Jackson提供了TypeFactory类,用于在运行时动态构建JavaType。TypeFactory.constructCollectionType()方法能够将集合类型和元素类型结合起来,形成一个完整的类型描述。

凹凸工坊-AI手写模拟器 凹凸工坊-AI手写模拟器

AI手写模拟器,一键生成手写文稿

凹凸工坊-AI手写模拟器 500 查看详情 凹凸工坊-AI手写模拟器

具体步骤如下:

传入元素类型: 修改泛型方法,使其接受一个Class类型的参数,该参数代表列表中元素的具体类型。使用TypeFactory构建JavaType: 通过TypeFactory.defaultInstance().constructCollectionType(collectionClass, elementClass)方法,传入集合类型(例如List.class)和元素的Class对象,动态构建出完整的JavaType。

此外,为了增强方法的通用性,建议将文件路径参数替换为InputStream。这样,该方法不仅可以处理文件,还可以处理网络流、内存中的字节数组流等多种输入源。

下面是经过优化的泛型反序列化方法:

import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.type.TypeFactory;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.util.List;import java.util.ArrayList;public class GenericJacksonDeserializer {    // 示例模型类    private static class A {        public String name;        public int id;        // 默认构造函数是Jackson反序列化所必需的        public A() {}         public A(String name, int id) {            this.name = name;            this.id = id;        }        @Override        public String toString() {            return "A{name='" + name + "', id=" + id + "}";        }    }    private static class B {        public String description;        public double value;        // 默认构造函数        public B() {}        public B(String description, double value) {            this.description = description;            this.value = value;        }        @Override        public String toString() {            return "B{description='" + description + "', value=" + value + "}";        }    }    /**     * 通用的JSON列表反序列化方法     *     * @param inputStream 包含JSON数据的输入流     * @param elementType 列表中元素的Class对象     * @param  列表元素的类型     * @return 反序列化后的对象列表     * @throws IOException 如果读取或解析JSON时发生错误     */    private static  List readJsonAsList(InputStream inputStream, Class elementType) throws IOException {        ObjectMapper mapper = new ObjectMapper();        TypeFactory factory = TypeFactory.defaultInstance();        // 动态构建JavaType,指定集合类型为List.class,元素类型为elementType        return mapper.readValue(inputStream, factory.constructCollectionType(List.class, elementType));    }    public static void main(String[] args) {        // 假设我们有以下JSON文件        // a.json: [{"name":"Item A1","id":1},{"name":"Item A2","id":2}]        // b.json: [{"description":"Desc B1","value":10.5},{"description":"Desc B2","value":20.0}]        // 为了示例,我们先创建模拟的JSON文件        createDummyJsonFiles();        try (InputStream aStream = new FileInputStream("a.json")) {            List aList = readJsonAsList(aStream, A.class);            System.out.println("Deserialized A List: " + aList);        } catch (IOException exc) {            System.err.println("Error reading A list: " + exc.getMessage());            exc.printStackTrace();        }        try (InputStream bStream = new FileInputStream("b.json")) {            List bList = readJsonAsList(bStream, B.class);            System.out.println("Deserialized B List: " + bList);        } catch (IOException exc) {            System.err.println("Error reading B list: " + exc.getMessage());            exc.printStackTrace();        }    }    // 辅助方法:创建模拟的JSON文件    private static void createDummyJsonFiles() {        ObjectMapper mapper = new ObjectMapper();        try {            List dummyAList = new ArrayList();            dummyAList.add(new A("Item A1", 1));            dummyAList.add(new A("Item A2", 2));            mapper.writeValue(new File("a.json"), dummyAList);            List dummyBList = new ArrayList();            dummyBList.add(new B("Desc B1", 10.5));            dummyBList.add(new B("Desc B2", 20.0));            mapper.writeValue(new File("b.json"), dummyBList);            System.out.println("Dummy JSON files created: a.json, b.json");        } catch (IOException e) {            System.err.println("Failed to create dummy JSON files: " + e.getMessage());        }    }}

注意事项与总结

默认构造函数: 确保所有将被Jackson反序列化的类(如A和B)都包含一个无参的默认构造函数,Jackson需要它来实例化对象。InputStream的优势: 使用InputStream作为输入源,使得readJsonAsList方法具有更高的灵活性和通用性。无论是从文件、网络连接还是内存中的字符串读取JSON,都可以方便地适配。TypeFactory的核心作用: TypeFactory是Jackson处理复杂泛型类型反序列化的关键。当TypeReference因类型擦除而无法满足需求时,TypeFactory提供了一种在运行时动态构建类型信息的方法。

通过上述方法,我们成功创建了一个通用的Java泛型方法,能够利用Jackson库灵活地将JSON数据反序列化为任何指定类型的对象列表,极大地提高了代码的复用性和可维护性。理解并正确运用TypeFactory是掌握Jackson高级泛型操作的重要一步。

以上就是使用Jackson TypeFactory实现Java泛型列表反序列化的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/896008.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月28日 17:48:18
下一篇 2025年11月28日 17:48:40

相关推荐

  • 以太坊是什么币?以太坊ETH获得的方式有哪些?

    以太坊是一个基于智能合约的去中心化应用平台,其原生代币ETH可通过多种方式获取。1、通过Binance必安、欧意ok等中心化平台注册账户、完成KYC认证并用稳定币购买ETH;2、通过去中心化平台连接数字储存,使用稳定币或其他代币直接兑换ETH;3、参与网络质押,可选择独立质押(需32个ETH)、流动…

    2025年12月8日
    000
  • 稳定币完全手册:6种主流稳定币类型最新介绍

    稳定币作为数字资产领域的重要组成部分,为市场带来了前所未有的流动性和交易便捷性。它们的设计初衷是为了规避加密货币市场剧烈波动的风险,通过锚定法币或其他资产,试图提供一种相对稳定的价值储存和交换媒介。然而,并非所有稳定币都以相同的方式实现其稳定性,市场上的稳定币种类繁多,各具特色,理解它们的工作原理、…

    2025年12月8日
    000
  • 一文全方位了解GENIUS 稳定币法案解析

    2025年7月18日,美国总统签署了《指导与建立美国稳定币国家创新法案》(简称“GENIUS 法案”),标志着美国在数字资产监管领域迈出了历史性的一步。作为美国首部联邦层面的稳定币专项立法,该法案旨在为“支付型稳定币”建立一套全面、清晰的法律和监管框架。 GENIUS 法案的出台,不仅回应了过去稳定…

    2025年12月8日
    000
  • 以太坊闪耀:美国银行开启数字资产追踪,ETH 再成焦点

    美国银行开启数字资产追踪标志着以太坊在主流金融的认可度提升,1. 合法性认可度提升;2. 可能吸引机构配置数字资产;3. 推动合规化进程;4. 确认ETH作为“数字石油”的应用前景和潜在价值;以太坊成为焦点因其拥有庞大的DApp生态系统,1. 技术升级至PoS提升可扩展性、安全性和可持续性;2. 作…

    2025年12月8日 好文分享
    000
  • 7 月伊始,以太坊已跑赢比特币,山寨币季真的来了?

    是,以太坊领涨或预示山寨币季开启,但尚未全面爆发。1. ETF预期升温、生态复苏和质押率上升推动ETH上涨;2. BTC dominance下降、板块轮动初现及流动性改善构成潜在信号;3. 风险包括比特币虹吸效应、监管不确定性和资金量能不足;4. 结论认为需BTC dominance持续下降、ETH…

    2025年12月8日
    000
  • 以太坊重回区间高位,突破 2800 美元或点燃山寨币季

    以太坊强势突破2800美元,标志着山寨币季或将全面爆发;1.技术面与资金面共振,ETH日线突破头肩底形态,活跃地址与巨鲸持仓上升,衍生品市场做多情绪浓厚;2.山寨币跟涨效应显现,ETH/BTC汇率逼近0.06关键位,84%前50大山寨币周线收阳,OP、ARB、RNDR、FET等涨幅超30%;3.生态…

    好文分享 2025年12月8日
    000
  • 虚拟货币排名前十的主流币

    当前主流虚拟货币前十名为比特币、以太坊、泰达币、币安币、瑞波币、索拉纳、卡尔达诺、狗狗币、波卡和雪崩协议,它们凭借各自的技术优势和应用场景在市场中占据重要地位,其中比特币作为“数字黄金”具有开创性地位,以太坊通过智能合约推动了DeFi和NFT发展,泰达币作为稳定币提供市场流动性,币安币依托币安生态具…

    2025年12月8日 好文分享
    200
  • Ethena财库策略:稳定币第三帝国的崛起

    目录 双币系统大逃杀真实采用仍未发生结语 2023 年 8 月,makerdao 生态借贷协议 spark 给出 $dai 8% 的年化收益,随后孙割分批进入,累计投入 23 万枚 $steth,最高占 spark 存款量 15% 以上,逼得 makerdao 紧急提案,把利率下调到 5%。 Mak…

    2025年12月8日
    000
  • 炒币怎样才能避免做接盘侠?一定要警惕风险来临

    要避免炒币高位接盘,必须建立市场认知、风险识别与防御策略三位一体的防御体系:1. 识别牛市末期社交媒体激增、新币暴涨后暴跌、巨鲸减持等信号,熊市初期采用仓位金字塔法则和动态止损;2. 构建信息分级(战略/战术/噪音)、技术验证(均线与RSI、深度数据)、情绪隔离(三连亏停手、拔网线)三重滤镜;3. …

    2025年12月8日
    000
  • 炒币要不要跟风炒作热点?如果炒作热点该执行怎样的交易策略

    加密货币%ignore_a_2%炒作是信息不对称与情绪博弈的零和游戏,需通过风险识别、策略构建与认知升级实现平衡:1. 热点具有价值发现与高风险陷阱双重属性,如政策利好可推升比特币上涨18%,而缺乏支撑的Manus代币则暴跌95%;2. 筛选热点需考量政策驱动、技术突破与情绪驱动三类场景,并依据合规…

    2025年12月8日
    000
  • Zircuit(ZRC币)是什么?如何运作?ZRC项目概述,代币经济与前景分析

    目录 什么是ZircuitZircuit 如何运作Zircuit 的主要特点混合架构AI 安全EVM 兼容性安全原生桥Zircuit 积分Zircuit 质押什么是Zircuit 代币(ZRC)Zircuit(ZRC)币价格预测ZRC 币怎么买?结语 近年来,为以太坊(eth) layer 1 网络…

    2025年12月8日
    000
  • Naoris Protocol(NAORIS)登陆Binance Alpha平台:抗量子安全协议的价值分析与交易策略

    目录 币安 Alpha 和合约将上线 Naoris Protocol关键数据与估值分析交易操作建议未明确信息与后续更新 币安 Alpha 和合约将上线 Naoris Protocol naoris protocol(naoris)作为首个融合后量子密码学与swarm ai的分布式安全协议,将于202…

    2025年12月8日
    000
  • 币圈为什么说消息面只能作为参考

    消息面在加密货币市场的作用被过度放大,其本质是滞后的辅助工具而非独立决策依据。1. 市场特性决定散户处于劣势:信息传导存在时差,机构凭借合规渠道提前布局,如《天才法案》通过前Circle和Coinbase股价已反应;流动性分层使机构交易速度远超散户;项目方常操控叙事制造热点,导致散户追高被套。2. …

    2025年12月8日
    000
  • 币安币突破850美元创新高,有望突破1000美元关口

    加密市场正迎来继2021年以来的新一轮强劲上涨,多个主流及潜力币种接连刷新高点或逼近历史峰值,其中币安币(BNB)的表现尤为亮眼。近期,BNB价格强势突破关键阻力位,盘中一度飙升至850美元上方,创下历史新高,引发市场广泛关注。 在过去七天内,BNB成功摆脱了持续近两年的震荡区间,开启加速上涨模式。…

    2025年12月8日
    000
  • Ani Grok Companion(ANI币)是什么?值得投资吗?ANI项目背景与未来前景分析

    目录 项目背景项目类别1. 迷因币2. AI 和虚拟伴侣3. 娱乐和社交代币4. 实用和治理代币市场分析价格分析ANI代币经济学ANI币未来发展路线常见问题解答(FAQ)结论 ani grok companion (ani) 是一种受 ai 动漫伴侣启发的迷因币,主要特色是来自埃隆·马斯克的 gro…

    2025年12月8日
    000
  • 怎样理解市场情绪对加密货币价格的影响?市场情绪是陷阱还是蜜糖

    市场情绪在加密货币中既是风险也是机遇,1. 情绪通过信息茧房、杠杆放大和叙事主导形成指数级波动;2. 历史显示情绪可推动政策利好上涨,也导致LUNA崩盘等陷阱;3. 认知偏差如处置效应、锚定效应和社会认同加剧非理性;4. 应构建规则化止损、工具化过滤和系统化对冲的防御体系;5. 短期情绪为噪音,中期…

    2025年12月8日
    000
  • Alethea AI(ALI币)是什么?值得投资吗?ALI币主要特点及未来展望

    目录 什么是Alethea AI?什么是ALI代币?Alethea AI的历史Alethea AI的特点无需许可的协议质押iNFTs是什么让Alethea AI与众不同?Alethea AI 值得投资吗?Alethea AI的未来展望结语 随着chatgpt等人工智能技术的出现,人类正在进入一个新的…

    2025年12月8日
    000
  • 2025 年最佳加密货币交易机器人,一文评测与推荐

    云端 AI 策略代表:Cryptohopper 作为支持 Binance、Coinbase Pro 等 16 家主流交易所的云服务平台,Cryptohopper 的核心亮点在于其智能化策略库与零代码操作体验。平台内置的 AI 引擎可实时分析市场环境,自动匹配并切换至表现最优的策略模板,同时开放策略市…

    2025年12月8日
    000
  • 币安Naoris Protocol(NAORIS币)是什么?如何获取?NAORIS代币经济与未来发展介绍

    目录 Naoris Protocol项目定位Naoris Protocol核心技术Naoris Protocol(NAORIS)空投NAORIS代币经济Naoris Protocol生态进展风险与策略建议常见问题总结 naoris protocol是一种去中心化的安全即服务(security-as-…

    2025年12月8日 好文分享
    000
  • Berachain:流动性证明是什么?有什么特点?

    目录 什么是berachain? 什么是流动性证明? 流动性证明与权益证明的对比 Berachain的特别之处是什么? 突出特点 流动性证明(PoL)共识:双代币模型:EVM兼容性:BeaconKit框架:激励市场: 技术架构 结论 ‍Berachain是一个创新的EVM兼容的Layer 1区块链,…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信