皕杰技术社区

 找回密码
 立即加入

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 1604|回复: 12

皕杰报表根据json数据自定义数据集

[复制链接]
回帖奖励 10 金钱 回复本帖可获得 5 金钱奖励! 每人限 1 次
发表于 2019-5-7 17:03:55 | 显示全部楼层 |阅读模式
需求:根据json数据的url、json数据里的键名,生成自定义数据集并生成皕杰报表页面
准备工作:
Demo:jsonurl:https://api.douban.com/v2/movie/top250?start=0&count=10
Json键名:name,id,alt
Json字符串解析工具:Fastjson
解决方案:
1.新建皕杰报表自定义数据集类需要集成bios.report.api.customize.ArrayDataSet类
  1. package bios.report.dev.examples.dataset;
  2. public class MyJSONDataSet implements ArrayDataSet {
  3.         //新建数据集字段名
  4.         private static String[] metaData;
  5.         //新建list存储Object数组
  6.         private static List<Object[]> data =new ArrayList<Object[]>();;
  7.      
复制代码
 楼主| 发表于 2019-5-7 17:04:46 | 显示全部楼层

  1. @Override
  2.         // 获取数据集中传递的参数值
  3.         public void applyParams(Object[] arg0) {
  4.                 //获取数据集传参的jsonurl
  5.                 String url = arg0[0].toString();
  6.                 //获取数据集传参的键名
  7.                 String fields =arg0[1].toString();
  8.                 metaData = new String[] {};
  9.                 //传递的键名是字符串需要拆分成字符串组
  10.                 metaData = fields.split(",");
  11.                
  12.                 getjSON(url, metaData);
  13.         }
  14.         @Override
  15.         // 返回数据集字段名
  16.         public String[] getMetaData() {
  17.                 return metaData;
  18.         }
  19.         @Override
  20.         // 返回数据集数据长度
  21.         public int getRowCount() {
  22.                 return data.size();
  23.         }
  24.       
  25.         // 返回数据集中指定行的数据
  26.         public Object[] getRowData(int rowIndex) {
  27.                 return (Object[]) data.get(rowIndex);
  28.         }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-7 17:06:21 | 显示全部楼层

  1. // 根据传递到URL获取json数据
  2.         public static void getjSON(String url, String[] fields) {
  3.                 String res = "";
  4.                 StringBuffer buffer = new StringBuffer();
  5.                 try {
  6.                         URL urls = new URL(url);
  7.                         HttpURLConnection urlCon = (HttpURLConnection) urls.openConnection();
  8.                         if (200 == urlCon.getResponseCode()) {
  9.                                 InputStream is = urlCon.getInputStream();
  10.                                 InputStreamReader isr = new InputStreamReader(is, "utf-8");
  11.                                 BufferedReader br = new BufferedReader(isr);
  12.                                 String str = null;
  13.                                 while ((str = br.readLine()) != null) {
  14.                                         buffer.append(str);
  15.                                 }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-7 17:07:40 | 显示全部楼层
  1. br.close();
  2.                                 isr.close();
  3.                                 is.close();
  4.                                 res = buffer.toString();
  5.                                 parseJsonString(res, fields);
  6.                         }
  7.                 } catch (Exception e) {
  8.                         e.printStackTrace();
  9.                 }
  10.         }
  11.         //解析json字符串
  12.         public static void parseJsonString(String json, String[] fields) {
  13.                 LinkedHashMap<String, Object> jsonMap = JSON.parseObject(json,
  14.                                 new TypeReference<LinkedHashMap<String, Object>>() {
  15.                                 });
  16.                 for (Map.Entry<String, Object> entry : jsonMap.entrySet()) {
  17.                         parseJsonMap(entry, fields);
  18.                 }
  19.         }

复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-7 17:08:31 | 显示全部楼层
  1. /*
  2.          * 1、循环解析json
  3.          * 2、判断键名在json哪一层
  4.          * 3、根据键名获取数据并存储到数组中
  5.          * 4、将数组存储到list中
  6.          */
  7.         public static void parseJsonMap(Map.Entry<String, Object> entry,String[] fields) {
  8.                 // 如果是单个map继续遍历
  9.                 if (entry.getValue() instanceof Map) {
  10.                         LinkedHashMap<String, Object> jsonMap = JSON.parseObject(entry.getValue().toString(),
  11.                                         new TypeReference<LinkedHashMap<String, Object>>() {
  12.                                         });
  13.                         for (Map.Entry<String, Object> entry2 : jsonMap.entrySet()) {
  14.                                 parseJsonMap(entry2,fields);
  15.                         }
  16.                 }
  17.               
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-7 17:10:11 | 显示全部楼层
  1. // 如果是list就提取出来
  2.                 if (entry.getValue() instanceof List) {
  3.                         List list =  (List) entry.getValue();
  4.                         for (int i = 0; i < list.size(); i++) {
  5.                                 // 如何还有,循环提取
  6.                                 if(list.get(i).toString().contains("[") || (list.get(i).toString().contains("{"))) {
  7.                                         LinkedHashMap<String, Object> jsonMap = JSON.parseObject(list.get(i).toString(),
  8.                                                         new TypeReference<LinkedHashMap<String, Object>>() {
  9.                                                         });
  10.                                         Object[] str1=new Object[fields.length];
  11.                                        
  12.                                        
  13.                                                       
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-7 17:11:22 | 显示全部楼层

  1. for (Map.Entry<String, Object> entry1 : jsonMap.entrySet()) {
  2.                                                 if(Arrays.asList(fields).contains(entry1.getKey())) {
  3.                                                         JSONObject jObject=JSON.parseObject(list.get(i).toString());
  4.                                                         String jString=JSONObject.toJSONString(jObject,SerializerFeature.WriteMapNullValue);
  5.                                                         JSONObject jObject2=JSON.parseObject(jString);
  6.                                                         
  7.                                                         for (int j = 0; j < fields.length; j++) {
  8.                                                                 if(jObject2.getString(fields[j])==null) {
  9.                                                                         str1[j]="";
  10.                                                                 }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-7 17:13:56 | 显示全部楼层
  1. else {
  2.                                                                         str1[j]=jObject2.getString(fields[j]);
  3.                                                                 }
  4.                                                         }
  5.                                                 }else {
  6.                                                         parseJsonString(list.get(i).toString(), fields);
  7.                                                 }
  8.                                         }
  9.                                         data.add(str1);
  10.                                 }
  11.                         }
  12.                 }
  13.         }
  14. }
复制代码

2.将自定义数据集类导出jar包
3.设计器中将自定义数据集jar包和fastjsonjar包导入进来

4.新建报表-新建参数url和fields
参数url:字符串类型、jsonurl
参数fields:字符串类型、json键名

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即加入

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-7 17:17:43 | 显示全部楼层

5.新建数据集,数据源不选择、类型为自定义 类型

编辑查询sql,写这个自定义数据集类的package.class

选择数据集参数,将需要传参的参数设置上去(参数顺序和自定义数据集类中的顺序一致)

6.报表设计

A3表达式 =ds.select(#0) ,扩展方向为纵向扩展
B2表达式 =parting(@fields,','),扩展方向为横向扩展
B3表达式 =eval("ds.getone("+B2+",#0=A3)")
7.Web预览

8.读取json数据成功。
9.将brt文件、fastjson jar包和自定义数据集jar包复制到web应用中。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即加入

x
回复 支持 反对

使用道具 举报

发表于 2019-5-8 14:38:43 | 显示全部楼层

回帖奖励 +5 金钱

多谢分享,技术大牛
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

本版积分规则

QQ|小黑屋|手机版|皕杰软件 ( 京ICP备14050931号 )

GMT+8, 2024-3-3 20:34 , Processed in 1.141514 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表