0

0

从嵌套JSON中提取并计算元素最小最大出现次数的Java实践

花韻仙語

花韻仙語

发布时间:2025-07-31 21:44:11

|

389人浏览过

|

来源于php中文网

原创

从嵌套JSON中提取并计算元素最小最大出现次数的Java实践

本教程详细介绍了如何利用Josson库高效处理复杂嵌套JSON数据,将其转换为Java POJO,并在此过程中计算特定字段(如单词出现次数)的最小值和最大值。通过结合Josson强大的数据转换能力与Jackson的反序列化功能,能够简化数据处理流程,避免手动编写复杂的解析逻辑,提升开发效率。

1. 问题背景与需求分析

在java开发中,我们经常需要处理来自外部服务或文件中的json数据。有时,这些json结构可能比较复杂,例如包含多层嵌套的数组,并且需要从这些嵌套数据中提取并聚合信息。

考虑以下JSON结构,它是一个多层嵌套的数组,每一层内部数组包含多个对象,每个对象有word和count字段:

[
  [
    {"word": "china", "count": 0},
    {"word": "kids", "count": 1},
    {"word": "music", "count": 0}
  ],
  [
    {"word": "china", "count": 3},
    {"word": "kids", "count": 0},
    {"word": "music", "count": 2}
  ],
  [
    {"word": "china", "count": 10},
    {"word": "kids", "count": 3},
    {"word": "music", "count": 2}
  ]
]

我们的目标是将这个复杂的JSON数据转换为一个简洁的Java POJO列表。对于每个唯一的word,我们需要计算它在所有嵌套数组中count字段的最小值(min)和最大值(max),并将其映射到如下的Word POJO中:

public class Word {
    private String text;
    private Integer min;
    private Integer max;
    // Getters and Setters
}

例如,对于"china"这个词,其count值分别为0、3、10。因此,转换后对应的Word对象应为text="china", min=0, max=10。

2. POJO定义

首先,定义用于接收转换后数据的Word POJO。为了让Jackson能够正确地进行反序列化,需要为字段提供公共的setter方法。

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

public class Word {
    private String text;
    private Integer min;
    private Integer max;

    public void setText(String text) {
        this.text = text;
    }

    public void setMin(Integer min) {
        this.min = min;
    }

    public void setMax(Integer max) {
        this.max = max;
    }

    @Override
    public String toString() {
        return String.format("text=%s min=%d max=%d", text, min, max);
    }
}

3. 解决方案:利用Josson进行JSON数据转换

直接使用Jackson处理这种复杂的聚合和转换逻辑会非常繁琐,可能需要编写自定义的反序列化器。幸运的是,我们可以利用Josson这个强大的JSON处理库,在反序列化之前对JSON数据进行预处理和转换。Josson提供了一套类似XPath的查询语言,可以方便地进行数据的过滤、转换、分组和聚合。

3.1 引入依赖

要在项目中集成Josson和Jackson,需要在pom.xml(Maven项目)或build.gradle(Gradle项目)中添加相应的依赖:

Maven:


    
        com.octomix.josson
        josson
        1.2.3 
    
    
        com.fasterxml.jackson.core
        jackson-databind
        2.15.2 
    

3.2 JSON原始数据

为了演示,我们将原始JSON字符串硬编码。在实际应用中,这通常是从文件、网络请求或其他数据源获取的。

String jsonString = "[" +
    "  [" +
    "    {\"word\": \"china\", \"count\": 0}," +
    "    {\"word\": \"kids\", \"count\": 1}," +
    "    {\"word\": \"music\", \"count\": 0}" +
    "  ]," +
    "  [" +
    "    {\"word\": \"china\", \"count\": 3}," +
    "    {\"word\": \"kids\", \"count\": 0}," +
    "    {\"word\": \"music\", \"count\": 2}" +
    "  ]," +
    "  [" +
    "    {\"word\": \"china\", \"count\": 10}," +
    "    {\"word\": \"kids\", \"count\": 3}," +
    "    {\"word\": \"music\", \"count\": 2}" +
    "  ]" +
    "]";

3.3 Josson转换表达式解析

Josson的核心在于其强大的表达式语言。为了达到我们的目标,我们将使用以下Josson表达式:

知了zKnown
知了zKnown

知了zKnown:致力于信息降噪 / 阅读提效的个人知识助手。

下载

flatten().group(word).map(text:word, min:elements.min(count), max:elements.max(count))

让我们逐一解析这个表达式:

  • flatten(): 这个函数用于将多层嵌套的数组扁平化为一层数组。原始JSON是一个包含数组的数组,flatten()会将其转换为一个单一的包含所有word对象的数组。 例如,经过flatten()后,数据结构将类似于: [{"word": "china", "count": 0}, {"word": "kids", "count": 1}, ..., {"word": "china", "count": 10}, ...]

  • group(word): 在扁平化之后,我们希望对数据按word字段进行分组。group(word)会将所有具有相同word值的对象归类到一起。每个分组会包含一个word键(作为分组依据)和一个elements键(包含该分组下的所有原始元素)。

  • map(text:word, min:elements.min(count), max:elements.max(count)): map()函数用于将每个分组转换为我们期望的输出格式。它允许我们重命名字段并进行聚合操作。

    • text:word: 将分组的word字段映射到输出对象的text字段。
    • min:elements.min(count): 对于每个分组,elements代表该分组下的所有原始元素。elements.min(count)会计算这些元素中count字段的最小值,并将其映射到输出对象的min字段。
    • max:elements.max(count): 类似地,elements.max(count)会计算count字段的最大值,并将其映射到输出对象的max字段。

3.4 Jackson反序列化

Josson转换后的结果是一个JsonNode对象,其结构已经与我们的Word POJO列表相匹配。此时,我们可以使用Jackson的ObjectMapper将其轻松地反序列化为List

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.octomix.josson.Josson;

// ... (Word POJO definition)

public class JsonToPojoConverter {
    public static void main(String[] args) throws Exception {
        String jsonString = "[" +
            "  [" +
            "    {\"word\": \"china\", \"count\": 0}," +
            "    {\"word\": \"kids\", \"count\": 1}," +
            "    {\"word\": \"music\", \"count\": 0}" +
            "  ]," +
            "  [" +
            "    {\"word\": \"china\", \"count\": 3}," +
            "    {\"word\": \"kids\", \"count\": 0}," +
            "    {\"word\": \"music\", \"count\": 2}" +
            "  ]," +
            "  [" +
            "    {\"word\": \"china\", \"count\": 10}," +
            "    {\"word\": \"kids\", \"count\": 3}," +
            "    {\"word\": \"music\", \"count\": 2}" +
            "  ]" +
            "]";

        // 1. 使用Josson解析JSON字符串
        Josson josson = Josson.fromJsonString(jsonString);

        // 2. 执行Josson转换表达式
        JsonNode node = josson.getNode(
            "flatten()" +
            ".group(word)" +
            ".map(text:word, min:elements.min(count), max:elements.max(count))"
        );

        // 3. 使用Jackson将转换后的JsonNode反序列化为List
        ObjectMapper objectMapper = new ObjectMapper();
        List words = objectMapper.convertValue(node, new TypeReference>() {});

        // 4. 打印结果
        words.forEach(System.out::println);
    }
}

4. 运行结果

执行上述代码,将得到以下输出:

text=china min=0 max=10
text=kids min=0 max=3
text=music min=0 max=2

这正是我们期望的结果,每个单词的min和max出现次数都被正确计算并映射到了Word POJO中。

5. 注意事项与总结

  • Josson的优势: 对于复杂的JSON转换和聚合需求,Josson提供了一种声明式、简洁高效的解决方案。相比于手动编写复杂的Java代码来遍历、分组和计算,Josson的表达式更易读、易维护,并且通常性能更优。
  • 版本兼容性: 确保Josson和Jackson的依赖版本兼容,并尽量使用较新的稳定版本。
  • 错误处理: 在实际应用中,应考虑对JSON解析和转换过程中可能出现的异常进行处理,例如JsonProcessingException。
  • 表达式调试: 对于复杂的Josson表达式,可以通过分步执行或使用Josson提供的在线工具进行调试,以确保表达式的正确性。
  • 灵活性: Josson的表达式语言非常灵活,可以根据不同的需求进行调整,实现各种复杂的JSON数据操作,例如过滤、排序、连接等。

通过本教程,我们学习了如何巧妙地结合Josson和Jackson,高效地处理嵌套JSON数据,并进行复杂的聚合计算,最终将其转换为符合业务需求的Java POJO。这种方法显著简化了数据处理逻辑,提升了开发效率和代码的可维护性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

419

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

77

2025.09.10

Java Maven专题
Java Maven专题

本专题聚焦 Java 主流构建工具 Maven 的学习与应用,系统讲解项目结构、依赖管理、插件使用、生命周期与多模块项目配置。通过企业管理系统、Web 应用与微服务项目实战,帮助学员全面掌握 Maven 在 Java 项目构建与团队协作中的核心技能。

0

2025.09.15

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

198

2023.11.20

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1900

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2091

2024.08.01

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

0

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.3万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.0万人学习

ASP 教程
ASP 教程

共34课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号