0

0

利用Josson和Jackson处理复杂JSON数据:聚合与POJO映射

霞舞

霞舞

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

|

736人浏览过

|

来源于php中文网

原创

利用Josson和Jackson处理复杂JSON数据:聚合与POJO映射

本文详细阐述了如何使用Josson库高效处理嵌套的JSON数据结构,实现特定字段(如count)的最小值和最大值聚合,并最终将聚合结果映射到简洁的Java POJO对象。教程涵盖了Josson的链式查询语法,包括展平、分组和聚合操作,最后结合Jackson进行POJO反序列化,为复杂数据转换提供了清晰的解决方案。

1. 背景与挑战

在实际的java开发中,我们经常需要处理来自外部服务或文件的不规则json数据。一个常见的场景是,json数据以嵌套数组的形式组织,其中包含重复的元素,并且我们需要对这些重复元素的某个属性进行聚合计算(例如,查找最小值和最大值),然后将聚合后的结果映射到一个扁平化的pojo对象。

考虑以下JSON结构:

[
  [
    {"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}
  ]
]

我们的目标是将其转换为一个简单的Java对象列表,每个对象代表一个唯一的单词及其在所有出现中的最小和最大计数:

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

例如,对于“china”这个词,其count值分别为0、3、10,我们期望得到text="china", min=0, max=10。直接使用Jackson ObjectMapper进行反序列化难以实现这种聚合逻辑。这时,引入一个强大的JSON查询和转换库就显得尤为重要。

2. 目标POJO定义

首先,我们定义目标POJO Word 类,它将承载聚合后的数据:

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

    // 构造函数、Getter和Setter方法
    public Word() {} // Jackson需要无参构造函数

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

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

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

    public String getText() {
        return text;
    }

    public Integer getMin() {
        return min;
    }

    public Integer getMax() {
        return max;
    }

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

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

为了实现复杂的聚合和结构转换,我们引入Josson库。Josson是一个强大的Java JSON处理器,它允许我们使用类似于SQL的查询语法对JSON数据进行筛选、转换和聚合。

3.1 引入依赖

在使用Josson之前,请确保在您的项目中添加相应的Maven或Gradle依赖。

Faceswap
Faceswap

免费开源的AI换脸工具

下载

Maven:


    com.github.octomix
    josson
    1.3.0 


    com.fasterxml.jackson.core
    jackson-databind
    2.17.0 

Gradle:

implementation 'com.github.octomix:josson:1.3.0' // 请检查最新版本
implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.0' // 请检查最新版本

3.2 核心转换逻辑

Josson通过其查询语言提供了一种简洁的方式来处理上述转换。以下是实现步骤和关键的Josson查询表达式:

  1. 加载JSON数据: 使用Josson.fromJsonString()方法加载原始JSON字符串。
  2. 展平数组: 原始JSON是一个二维数组。flatten()操作将所有嵌套的数组元素展平为一个单一的列表,方便后续处理。
  3. 按单词分组: group(word)操作将展平后的数据按照word字段进行分组。这样,所有具有相同word值的对象都会被归到同一个组中。
  4. 映射并聚合: map(text:word, min:elements.min(count), max:elements.max(count))是核心转换步骤。
    • map(...):用于创建新的JSON对象。
    • text:word:将当前组的word值映射到新对象的text字段。
    • min:elements.min(count):elements代表当前组中的所有原始元素。min(count)对这些元素中的count字段执行最小值聚合。
    • max:elements.max(count):对count字段执行最大值聚合。
  5. Jackson反序列化: Josson转换后的结果是一个JsonNode对象,其结构与我们的Word POJO完全匹配。最后,我们可以使用Jackson的ObjectMapper.convertValue()方法将其直接反序列化为List

3.3 完整代码示例

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

import java.util.List;

public class JsonDataProcessor {

    public static void main(String[] args) {
        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}" +
                "  ]" +
                "]";

        try {
            // 1. 使用Josson加载JSON字符串
            Josson josson = Josson.fromJsonString(jsonString);

            // 2. 执行Josson查询,转换并聚合数据
            JsonNode transformedNode = josson.getNode(
                    "flatten()" +
                    ".group(word)" +
                    ".map(text:word, min:elements.min(count), max:elements.max(count))"
            );

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

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

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出结果:

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

4. 注意事项与总结

  • Josson的强大之处: Josson库极大地简化了复杂JSON数据的处理,特别是当需要进行展平、分组、聚合等操作时。它提供了一种声明式的方式来定义数据转换逻辑,避免了手动编写复杂的循环和条件判断代码。
  • 与Jackson的协同: Josson主要负责JSON结构和内容的转换,而Jackson则专注于将最终符合POJO结构的JSON数据反序列化为Java对象。两者结合,可以高效地处理各种复杂的JSON映射需求。
  • 查询语言的灵活性: Josson的查询语言非常灵活,支持多种操作符和函数,可以满足更复杂的业务逻辑需求,例如过滤、排序、连接等。开发者可以查阅Josson的官方文档以获取更多高级用法。
  • 性能考量: 对于非常大的JSON文件,需要考虑内存使用和处理性能。Josson在内存中构建JsonNode,因此数据量过大时可能需要优化策略,例如分批处理或使用流式解析。
  • 错误处理: 在实际应用中,应加入更健壮的错误处理机制,例如捕获JsonProcessingException等异常,以应对无效的JSON输入或查询错误。

通过上述方法,我们成功地将一个嵌套且需要聚合的复杂JSON结构,高效地转换并映射到了一个简洁的Java POJO列表,这在数据处理和系统集成中具有广泛的应用价值。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

727

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

327

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

350

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1243

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

360

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

821

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

581

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

423

2024.04.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

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

精品课程

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

共21课时 | 3.1万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

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

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