Java中构建混合类型JSON数组:字符串与对象并存的实践指南

Java中构建混合类型JSON数组:字符串与对象并存的实践指南

本教程详细介绍了如何在Java中利用Gson库构建一个包含字符串和JSON对象的混合类型JSON数组。文章通过具体示例代码,演示了如何创建JsonArray、添加原始字符串和序列化Java对象为JsonObject,最终生成符合特定结构的JSON输出,避免了传统序列化工具在处理混合类型数据时的局限性。

问题背景:构建混合类型JSON数组的挑战

在java开发中,我们经常需要将数据结构序列化为json格式。常见的场景是序列化一个包含同类型对象的列表,例如:

[    {        "name": "testName",        "phone": "123456"    }]

这可以通过Jackson ObjectMapper 或 Gson 等库轻松实现。然而,当需求变得复杂,需要构建一个包含不同数据类型的JSON数组时,例如一个数组中既有原始字符串又有JSON对象:

[    "Test1",    {        "name": "testName",        "phone": "123456"    }]

此时,传统的将Java对象列表直接序列化的方法将不再适用。例如,如果尝试将一个只包含 TestClass 实例的 ArrayList 进行序列化,得到的结果将缺少顶层的字符串 “Test1″。

以下是原始代码示例及其输出:

Java类定义:

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

public class TestClass {    String name;    String phone;    public TestClass(String name, String phone) {        super();        this.name = name;        this.phone = phone;    }    public String getName() {        return name;    }    public String getPhone() {        return phone;    }}

主程序序列化逻辑(使用Jackson):

import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.core.JsonProcessingException;import java.util.ArrayList;import java.util.List;public class TestProjectApplication {    public static void main(String[] args) throws JsonProcessingException {        var testObject = new TestClass("testName", "123456");        List testObjectList = new ArrayList();        testObjectList.add(testObject);        var mapper = new ObjectMapper();        // 直接序列化列表        System.out.println(mapper.writeValueAsString(testObjectList));    }}

输出结果:

[    {        "name": "testName",        "phone": "123456"    }]

可以看到,这种方法无法将字符串 “Test1” 添加到数组的开头。为了实现这种混合类型的JSON数组,我们需要更灵活的JSON构建方式。

解决方案:利用Gson库灵活构建JSON结构

Google的Gson库提供了一套强大的API,允许我们以编程方式构建JSON结构,这对于处理非标准或混合类型的JSON数据非常有用。其核心在于 JsonElement 及其子类:JsonPrimitive (表示原始值如字符串、数字、布尔值)、JsonObject (表示JSON对象) 和 JsonArray (表示JSON数组)。

核心概念:JsonElement、JsonPrimitive与JsonObject

Gson: Gson库的主要入口点,用于将Java对象序列化为JSON,或将JSON反序列化为Java对象。JsonArray: 代表一个JSON数组 []。我们可以向其中添加各种 JsonElement。JsonPrimitive: 代表一个JSON原始值,如字符串 “Test1″、数字 123 或布尔值 true。JsonObject: 代表一个JSON对象 {}。我们可以向其中添加键值对,其中值可以是任何 JsonElement。JsonElement: 是 JsonPrimitive、JsonObject 和 JsonArray 的抽象基类,允许我们以多态方式处理JSON的任何组成部分。

实现步骤与代码示例

为了构建目标JSON结构 [“Test1”, {“name”: “testName”, “phone”: “123456”}],我们可以按照以下步骤操作:

添加Gson依赖: 在项目的 pom.xml (Maven) 或 build.gradle (Gradle) 中添加Gson库的依赖。

Maven:

    com.google.code.gson    gson    2.10.1 

Gradle:

implementation 'com.google.code.gson:gson:2.10.1' // 使用最新稳定版本

创建 Gson 实例:

import com.google.gson.Gson;import com.google.gson.GsonBuilder;import com.google.gson.JsonArray;import com.google.gson.JsonObject;import com.google.gson.JsonPrimitive;// ... TestClass 定义不变 ...public class JsonMixedArrayGenerator {    public static void main(String[] args) {        // 创建一个Gson实例,并配置为漂亮打印(可选,但有助于可读性)        Gson gson = new GsonBuilder().setPrettyPrinting().create();        // 1. 创建TestClass对象        TestClass testObject = new TestClass("testName", "123456");        // 2. 创建一个JsonArray        JsonArray jsonArray = new JsonArray();        // 3. 添加第一个元素:字符串 "Test1"        jsonArray.add(new JsonPrimitive("Test1"));        // 4. 添加第二个元素:TestClass对象对应的JsonObject        // 可以通过Gson将Java对象直接转换为JsonElement(这里是JsonObject)        jsonArray.add(gson.toJsonTree(testObject));        // 5. 将JsonArray序列化为JSON字符串并打印        String jsonOutput = gson.toJson(jsonArray);        System.out.println(jsonOutput);    }}

完整代码示例:

import com.google.gson.Gson;import com.google.gson.GsonBuilder;import com.google.gson.JsonArray;import com.google.gson.JsonObject;import com.google.gson.JsonPrimitive;// 定义TestClass,保持不变class TestClass {    String name;    String phone;    public TestClass(String name, String phone) {        super();        this.name = name;        this.phone = phone;    }    public String getName() {        return name;    }    public String getPhone() {        return phone;    }}public class JsonMixedArrayGenerator {    public static void main(String[] args) {        // 创建一个Gson实例,配置为漂亮打印以提高输出可读性        Gson gson = new GsonBuilder().setPrettyPrinting().create();        // 实例化需要包含在JSON中的Java对象        TestClass testObject = new TestClass("testName", "123456");        // 创建一个空的JSON数组        JsonArray jsonArray = new JsonArray();        // 将字符串 "Test1" 作为JsonPrimitive添加到数组中        jsonArray.add(new JsonPrimitive("Test1"));        // 将TestClass对象转换为JsonElement(这里会是JsonObject)并添加到数组中        // gson.toJsonTree(Object) 方法可以将一个Java对象转换为其对应的JsonElement表示        jsonArray.add(gson.toJsonTree(testObject));        // 将构建好的JsonArray序列化为JSON字符串        String jsonOutput = gson.toJson(jsonArray);        // 打印最终的JSON字符串        System.out.println(jsonOutput);    }}

输出结果:

[  "Test1",  {    "name": "testName",    "phone": "123456"  }]

通过这种方式,我们成功地构建了一个包含原始字符串和Java对象(序列化为JSON对象)的混合类型JSON数组,完美匹配了预期的结构。

注意事项与最佳实践

依赖管理: 确保项目中正确添加了Gson的依赖。可读性: 使用 new GsonBuilder().setPrettyPrinting().create() 可以生成格式化的JSON输出,这在开发和调试时非常有帮助。错误处理: 虽然手动构建 JsonElement 树时不太可能出现 JsonProcessingException,但在更复杂的场景(如从字符串解析JSON)中,仍需考虑异常处理。适用场景: 当需要构建非标准、混合类型、或者动态变化的JSON结构时,手动构建 JsonElement 树是一种非常灵活和强大的方法。对于简单的、同质的Java对象到JSON的映射,直接使用 gson.toJson(javaObject) 仍然是首选。Jackson库的替代方案: 如果项目主要使用Jackson,也可以通过 ArrayNode 和 ObjectNode 等节点类型来构建类似的混合JSON结构,其原理与Gson的 JsonArray 和 JsonObject 类似。

总结

本教程详细展示了如何利用Gson库在Java中构建一个包含字符串和JSON对象的混合类型JSON数组。通过直接操作 JsonArray、JsonPrimitive 和 JsonObject 等底层 JsonElement,开发者可以精确地控制JSON的输出结构,从而满足各种复杂的序列化需求。这种方法提供了比传统对象列表序列化更高的灵活性,是处理复杂JSON场景的有效工具。

以上就是Java中构建混合类型JSON数组:字符串与对象并存的实践指南的详细内容,更多请关注创想鸟其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
星巴克冰摇柠檬茶抖音点单:清新夏日必备饮品
上一篇 2025年11月15日 06:36:08
三星980 Pro SSD怎么测速 CrystalDiskMark跑分解析
下一篇 2025年11月15日 06:38:10

相关推荐

  • 散热膏的涂抹方式是否会对温度结果产生显著影响?

    散热膏涂抹方式影响散热效果,常见方法有米粒法、X形法、五点法和手动涂抹法,选择合适方法需根据散热器设计、CPU顶盖平整度和散热膏粘稠度;涂抹时应控制用量、避免溢出,确保均匀覆盖,过多或不均会导致温度升高或短路风险;一般建议1-2年更换一次,并选用高导热系数、适中粘稠度、良好电绝缘性的知名品牌产品。 …

    2026年9月29日
    100
  • 抖音直播画面卡顿怎么办 抖音直播画面优化与网络调整技巧

    先确认上行网速是否达标,再优化设备编码设置。使用有线连接、关闭占用程序、开启硬编码并匹配分辨率与码率,结合平台工具调试,可有效解决抖音直播卡顿问题。 抖音直播画面卡顿,核心问题通常出在网络上传带宽不足或电脑编码性能不够。很多人以为家里宽带是千兆就一定流畅,其实直播看的是上行网速,这才是关键。下面从网…

    2026年9月29日
    100
  • 掌握VSCode插件开发与发布完整实战教程

    答案:开发并发布VSCode插件需先安装Node.%ignore_a_1%和yo generator-code,用yo code初始化项目后,在extension.ts中注册命令并在package.json声明;通过F5调试验证功能;最后安装vsce工具,配置发布者和PAT令牌,运行vsce pub…

    2026年9月29日
    800
  • 如何在Java中使用用户输入退出for或while循环

    如何在Java中使用用户输入退出for或while循环如何在Java中使用用户输入退出for或while循环如何在Java中使用用户输入退出for或while循环如何在Java中使用用户输入退出for或while循环

    本文旨在介绍如何在Java程序中,通过用户输入来灵活地中断for或while循环的执行。我们将探讨如何使用BufferedReader类来接收用户输入,并在循环内部判断输入是否为特定退出指令,从而实现程序的动态控制。同时,也会提供代码示例和注意事项,帮助你编写更健壮、更易维护的Java代码。 使用B…

    2026年9月29日 • 用户投稿
    000
  • 前端开发如何安装Sublime_Sublime前端环境搭建教程

    前端开发如何安装Sublime_Sublime前端环境搭建教程前端开发如何安装Sublime_Sublime前端环境搭建教程前端开发如何安装Sublime_Sublime前端环境搭建教程前端开发如何安装Sublime_Sublime前端环境搭建教程

    首先安装Sublime Text并配置Package Control插件管理器,接着安装Emmet、HTML-CSS-JS Prettify等前端插件,然后设置文件类型关联以正确识别.html、.css、.js文件语法,最后通过快捷键配置实现代码格式化功能。 如果您尝试在前端开发中使用 Sublim…

    2026年9月29日 • 用户投稿
    1700
  • 抖音广告如何精准投放?抖音投放广告价格一览

    抖音广告如何精准投放?抖音投放广告价格一览抖音广告如何精准投放?抖音投放广告价格一览抖音广告如何精准投放?抖音投放广告价格一览抖音广告如何精准投放?抖音投放广告价格一览

    在移动互联网时代,抖音作为一款热门的短视频平台,吸引了大量用户。对于广告主来说,如何在抖音平台上精准投放广告,实现高效营销,成为了亟待解决的问题。本文将为你揭秘抖音广告精准投放的秘诀,助你轻松实现营销目标。 一、了解抖音广告投放平台 1. 抖音广告投放平台:抖音广告投放平台主要包括抖音广告管家、抖音…

    2026年9月29日 • 用户投稿
    100
  • GPU功耗超1000W 微软发布芯片级液冷散热技术:温度骤降65%

    GPU功耗超1000W 微软发布芯片级液冷散热技术:温度骤降65%GPU功耗超1000W 微软发布芯片级液冷散热技术:温度骤降65%GPU功耗超1000W 微软发布芯片级液冷散热技术:温度骤降65%GPU功耗超1000W 微软发布芯片级液冷散热技术:温度骤降65%

    9月24日,随着ai技术的快速发展,高性能芯片尤其是ai gpu的需求激增,但随之而来的功耗问题也日益严峻。下一代gpu的功耗预计将突破1000w,带来散热与能效方面的巨大挑战。 为应对这一难题,微软推出了一项创新的芯片级液冷解决方案——microfluidics(微流体)技术。该技术通过在硅芯片背…

    2026年9月29日 • 用户投稿
    100
  • 怎么用豆包AI帮我生成Docker配置 用AI快速创建最佳容器化方案的秘诀

    怎么用豆包AI帮我生成Docker配置 用AI快速创建最佳容器化方案的秘诀怎么用豆包AI帮我生成Docker配置 用AI快速创建最佳容器化方案的秘诀怎么用豆包AI帮我生成Docker配置 用AI快速创建最佳容器化方案的秘诀怎么用豆包AI帮我生成Docker配置 用AI快速创建最佳容器化方案的秘诀

    豆包ai能高效生成并优化docker配置,关键在于提问方式和信息完整度。1. 明确应用类型、依赖及部署需求,如服务语言、数据库、端口暴露等;2. 提供现有配置文件让ai检查安全与性能问题;3. 常见优化建议包括使用alpine镜像、多阶段构建、非root运行等;4. 可要求生成不同环境的配置文件(开…

    2026年9月29日 • 用户投稿
    100
  • Java中将当前时间转换为秒数

    Java中将当前时间转换为秒数Java中将当前时间转换为秒数Java中将当前时间转换为秒数Java中将当前时间转换为秒数

    本文介绍了如何在Java中将当前时间转换为自当天开始的秒数,并提供使用java.time.LocalTime类的示例代码。通过LocalTime.now()获取当前时间,并使用toSecondOfDay()方法将其转换为秒数。同时,还介绍了如何处理时区问题以及如何使用更易读的方式定义目标时间。 在J…

    2026年9月29日 • 用户投稿
    100
  • Mac如何设置静态IP地址_Mac网络手动配置静态IP教程

    Mac如何设置静态IP地址_Mac网络手动配置静态IP教程Mac如何设置静态IP地址_Mac网络手动配置静态IP教程Mac如何设置静态IP地址_Mac网络手动配置静态IP教程Mac如何设置静态IP地址_Mac网络手动配置静态IP教程

    首先将Mac的网络配置从DHCP改为手动,依次设置静态IP、子网掩码、路由器地址,并配置DNS服务器,最后通过终端ping命令验证网络连通性和域名解析是否正常。 如果您需要为您的Mac设备分配一个固定不变的网络地址以便于远程访问或服务器托管,那么您可能需要将网络配置从自动获取改为手动指定。以下是完成…

    2026年9月29日 • 用户投稿
    100
  • 小可搜搜App如何下载所需文件 小可搜搜App的离线下载步骤

    小可搜搜App如何下载所需文件 小可搜搜App的离线下载步骤小可搜搜App如何下载所需文件 小可搜搜App的离线下载步骤小可搜搜App如何下载所需文件 小可搜搜App的离线下载步骤小可搜搜App如何下载所需文件 小可搜搜App的离线下载步骤

    1、打开小可搜搜App,点击搜索框输入文件关键词,如“教学视频”或“电子书PDF”;2、在搜索结果中找到目标文件,点击进入详情页并确认信息;3、点击下载链接或“立即下载”按钮,等待下载完成即可在本地查看。此外,可复制文件链接,在App的“工具”或“下载”页进入离线下载功能,粘贴链接并新建任务,选择保…

    2026年9月29日 • 用户投稿
    300
  • Safari浏览器怎么关闭标签页预览_Safari浏览器标签页缩略图预览关闭方法

    Safari浏览器怎么关闭标签页预览_Safari浏览器标签页缩略图预览关闭方法Safari浏览器怎么关闭标签页预览_Safari浏览器标签页缩略图预览关闭方法Safari浏览器怎么关闭标签页预览_Safari浏览器标签页缩略图预览关闭方法Safari浏览器怎么关闭标签页预览_Safari浏览器标签页缩略图预览关闭方法

    可通过Safari偏好设置关闭标签页预览功能,进入设置→标签页→取消勾选“在标签页中显示网站预览”;配合快捷键如Command+Shift+Tab切换标签,或启用系统辅助功能中的减少动态效果,进一步优化浏览体验。 如果您在使用Safari浏览器时发现标签页以缩略图形式预览显示,影响浏览效率或视觉体验…

    2026年9月29日 • 用户投稿
    200
  • 摄像机如何设置分辨率_摄像机分辨率设置对画质的影响与调整方法

    摄像机如何设置分辨率_摄像机分辨率设置对画质的影响与调整方法摄像机如何设置分辨率_摄像机分辨率设置对画质的影响与调整方法摄像机如何设置分辨率_摄像机分辨率设置对画质的影响与调整方法摄像机如何设置分辨率_摄像机分辨率设置对画质的影响与调整方法

    调整摄像机分辨率可解决画面模糊或文件过大问题。首先通过摄像机菜单进入“图像设置”选择所需分辨率,如1082×1080或3840×2160;其次可用配套软件如Quik或iVMS-4200远程设置,适合网络或运动相机;再者连接HDMI时需匹配显示设备原生分辨率,避免黑边;最后结合帧率与码率优化画质,4K…

    2026年9月29日 • 用户投稿
    200
  • windows怎么安装补丁包.msu文件_windows .msu格式补丁包的安装方法

    windows怎么安装补丁包.msu文件_windows .msu格式补丁包的安装方法windows怎么安装补丁包.msu文件_windows .msu格式补丁包的安装方法windows怎么安装补丁包.msu文件_windows .msu格式补丁包的安装方法windows怎么安装补丁包.msu文件_windows .msu格式补丁包的安装方法

    首先通过命令提示符使用wusa命令安装.msu补丁,其次可双击文件图形化安装,最后也可用PowerShell调用wusa.exe完成部署,三种方法均需按提示重启系统应用更新。 如果您下载了Windows系统的补丁包但不确定如何正确安装.msu格式的更新文件,可能是由于系统未正确识别或手动安装流程不熟…

    2026年9月29日 • 用户投稿
    100
  • 使用 Java 比较版本号:正则表达式的替代方案

    使用 Java 比较版本号:正则表达式的替代方案使用 Java 比较版本号:正则表达式的替代方案使用 Java 比较版本号:正则表达式的替代方案使用 Java 比较版本号:正则表达式的替代方案

    本文介绍了一种在 Java 中比较版本号的有效方法,避免了使用正则表达式的复杂性和潜在问题。通过自定义 Version 类并实现 Comparable 接口,可以将版本号字符串转换为整数数组,从而实现准确的版本比较。该方法不仅清晰易懂,而且具有更好的可维护性和可扩展性。 在软件开发中,经常需要比较版…

    2026年9月29日 • 用户投稿
    000
  • 如何在Power BI中集成AI Power BI使用AI视觉分析数据

    如何在Power BI中集成AI Power BI使用AI视觉分析数据如何在Power BI中集成AI Power BI使用AI视觉分析数据如何在Power BI中集成AI Power BI使用AI视觉分析数据如何在Power BI中集成AI Power BI使用AI视觉分析数据

    在power bi中集成ai需多步骤实现,而非简单添加模块。1. 使用内置ai视觉分析功能如“分解树”和“关键影响因素”快速识别数据模式;2. 通过azure服务如anomaly detector进行复杂数据分析并可视化结果;3. 在power query中利用ai辅助清洗数据,提升效率;4. 自行…

    2026年9月29日 • 用户投稿
    100
  • 怎样为公司批量安装Sublime_Sublime企业部署安装指南

    怎样为公司批量安装Sublime_Sublime企业部署安装指南怎样为公司批量安装Sublime_Sublime企业部署安装指南怎样为公司批量安装Sublime_Sublime企业部署安装指南怎样为公司批量安装Sublime_Sublime企业部署安装指南

    首先准备标准化安装包和配置文件,再通过组策略或脚本批量部署,随后配置中央许可,最后验证安装与设置一致性。 如果您需要为公司内的多台计算机安装Sublime Text编辑器,以实现统一开发环境配置,则可以通过自动化脚本和集中化配置管理来完成批量部署。以下是实现企业级批量安装的具体步骤: 一、准备安装包…

    2026年9月29日 • 用户投稿
    400
  • 抖音笔记怎么发视频?抖音怎么发布笔记作品

    抖音笔记怎么发视频?抖音怎么发布笔记作品抖音笔记怎么发视频?抖音怎么发布笔记作品抖音笔记怎么发视频?抖音怎么发布笔记作品抖音笔记怎么发视频?抖音怎么发布笔记作品

    随着抖音的不断发展,越来越多用户选择在这个平台上记录生活、展示才华、分享创意。其中,抖音笔记作为一个融合图文与视频的多功能创作工具,正受到广泛关注。那么,抖音笔记如何发布视频内容?接下来,本文将为你全面解析操作流程。 一、发布前的准备工作 在正式发布抖音笔记视频之前,建议完成以下准备步骤: 1. 拥…

    2026年9月29日 • 用户投稿
    100
  • 文心一言官方主页直达链接 文心一言语言模型主页官方访问地址

    文心一言官方主页可通过百度智能云平台访问,官网地址为https://yiyan.baidu.com,用户需用百度账号登录或注册后使用,可体验文本生成、图像创作、代码编写等功能,部分高级功能需开通会员或企业权限,注意辨别官网以防假冒。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使…

    2026年9月29日
    100
  • 摄像机怎么连接电视播放_摄像机连接电视播放视频的详细操作步骤

    摄像机怎么连接电视播放_摄像机连接电视播放视频的详细操作步骤摄像机怎么连接电视播放_摄像机连接电视播放视频的详细操作步骤摄像机怎么连接电视播放_摄像机连接电视播放视频的详细操作步骤摄像机怎么连接电视播放_摄像机连接电视播放视频的详细操作步骤

    可通过HDMI线、AV线、存储卡或无线投屏将摄像机连接电视播放。1、HDMI连接:用HDMI线连接摄像机与电视,切换至对应HDMI输入源并开启摄像机回放。2、AV线连接:使用三色AV线对接视频音频接口,电视切换至AV模式后播放。3、存储卡播放:将SD卡插入电视卡槽或通过读卡器U盘连接USB口直接播放…

    2026年9月29日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信