You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问报表字符串参数中JSON的嵌套信息?

解决Jasper报表中JSON字符串参数访问嵌套数据的办法

办法一:直接用JSON数据源解析字符串参数

  • 配置JSON数据源
    给报表新增一个数据源,选择JSON Data Source类型,不要使用文件或URL作为输入源,而是通过表达式将字符串参数转换为输入流:

    new ByteArrayInputStream($P{books}.getBytes("UTF-8"))
    

    这样就能把传入的JSON字符串转换成可解析的数据源。

  • 映射字段获取数据

    • 顶层字段(如country、name):直接用$.country、$.name作为字段表达式即可取值
    • 嵌套的books数组:在列表组件中配置子数据源,表达式为:
      ((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("books")
      
      之后列表内的title和description字段,用$.title、$.description作为表达式就能获取对应嵌套值

办法二:自定义工具类解析JSON

如果第一种方式不适用,可以编写简单的Java工具类解析JSON字符串,转换为可直接使用的集合:

  • 编写解析工具类
    import com.fasterxml.jackson.databind.ObjectMapper;
    import java.util.List;
    import java.util.Map;
    
    public class JsonParseUtil {
        public static List<Map<String, Object>> extractBooks(String jsonStr) throws Exception {
            ObjectMapper mapper = new ObjectMapper();
            Map<String, Object> dataMap = mapper.readValue(jsonStr, Map.class);
            return (List<Map<String, Object>>) dataMap.get("books");
        }
    }
    
  • 报表中调用工具类
    1. 将工具类打包成JAR,放到报表的类路径下
    2. 创建变量或直接在数据源中调用方法获取书籍列表:
      JsonParseUtil.extractBooks($P{books})
      
    3. 将列表转换为Jasper支持的数据源:
      new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($V{booksList})
      
    4. 列表内的字段直接使用title、description作为字段名即可取值(对应Map的键名)

办法三:修改参数数据类型(若上游可配合)

如果参数传递方允许调整,将参数类型从java.lang.String改为net.sf.jasperreports.engine.data.JsonDataSource,或者直接传递解析后的Map/List集合,这样报表可以直接访问嵌套字段,无需额外转换步骤。


内容的提问来源于stack exchange,提问作者LordFirus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:35:28