如何根据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类
package bios.report.dev.examples.dataset;
public class MyJSONDataSet implements ArrayDataSet {
//新建数据集字段名
private static String[] metaData;
//新建list存储Object数组
private static List<Object[]> data =new ArrayList<Object[]>();;
@Override
//
获取数据集中传递的参数值
public void applyParams(Object[] arg0) {
//获取数据集传参的jsonurl
String url = arg0[0].toString();
//获取数据集传参的键名
String fields =arg0[1].toString();
metaData = new String[] {};
//传递的键名是字符串需要拆分成字符串组
metaData = fields.split(",");
getjSON(url, metaData);
}
@Override
//
返回数据集字段名
public String[]
getMetaData() {
return metaData;
}
@Override
//
返回数据集数据长度
public int getRowCount() {
return data.size();
}
@Override
//
返回数据集中指定行的数据
public Object[] getRowData(int rowIndex) {
return (Object[]) data.get(rowIndex);
}
//
根据传递到URL获取json数据
public static void getjSON(String url, String[] fields) {
String res = "";
StringBuffer buffer = new StringBuffer();
try {
URL urls = new URL(url);
HttpURLConnection urlCon = (HttpURLConnection)
urls.openConnection();
if (200 == urlCon.getResponseCode()) {
InputStream is = urlCon.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "utf-8");
BufferedReader br = new BufferedReader(isr);
String str = null;
while ((str = br.readLine()) != null) {
buffer.append(str);
}
br.close();
isr.close();
is.close();
res = buffer.toString();
parseJsonString(res, fields);
}
} catch (Exception e) {
e.printStackTrace();
}
}
//解析json字符串
public static void parseJsonString(String json, String[] fields) {
LinkedHashMap<String, Object> jsonMap= JSON.parseObject(json,
new TypeReference<LinkedHashMap<String, Object>>() {
});
for (Map.Entry<String,
Object> entry : jsonMap.entrySet()) {
parseJsonMap(entry, fields);
}
}
/*
* 1、循环解析json
* 2、判断键名在json哪一层
* 3、根据键名获取数据并存储到数组中
* 4、将数组存储到list中
*/
public static void parseJsonMap(Map.Entry<String, Object> entry,String[] fields) {
//
如果是单个map继续遍历
if (entry.getValue() instanceof Map) {
LinkedHashMap<String, Object> jsonMap= JSON.parseObject(entry.getValue().toString(),
new TypeReference<LinkedHashMap<String, Object>>() {
});
for (Map.Entry<String,
Object> entry2 : jsonMap.entrySet()) {
parseJsonMap(entry2,fields);
}
}
//
如果是list就提取出来
if (entry.getValue() instanceof List) {
Listlist= (List)entry.getValue();
for (int i = 0; i < list.size(); i++) {
// 如何还有,循环提取
if(list.get(i).toString().contains("[") || (list.get(i).toString().contains("{"))) {
LinkedHashMap<String, Object> jsonMap= JSON.parseObject(list.get(i).toString(),
new TypeReference<LinkedHashMap<String, Object>>() {
});
Object[] str1=new Object[fields.length];
for (Map.Entry<String,
Object> entry1 : jsonMap.entrySet()) {
if(Arrays.asList(fields).contains(entry1.getKey())) {
JSONObject jObject=JSON.parseObject(list.get(i).toString());
String jString=JSONObject.toJSONString(jObject,SerializerFeature.WriteMapNullValue);
JSONObject jObject2=JSON.parseObject(jString);
for (int j = 0; j < fields.length; j++) {
if(jObject2.getString(fields[j])==null) {
str1[j]="";
}else {
str1[j]=jObject2.getString(fields[j]);
}
}
}else {
parseJsonString(list.get(i).toString(), fields);
}
}
data.add(str1);
}
}
}
}
}
2. 将自定义数据集类导出jar包
3. 设计器中将自定义数据集jar包和fastjsonjar包导入进来
![](https://img.haomeiwen.com/i14922812/963adbb6dcd825b1.png)
4. 新建报表-新建参数url和fields
参数url:字符串类型、jsonurl
参数fields:字符串类型、json键名
5. 新建数据集,数据源不选择、类型为自定义类型
![](https://img.haomeiwen.com/i14922812/41a1daebbae12f27.png)
编辑查询sql,写这个自定义数据集类的package.class
![](https://img.haomeiwen.com/i14922812/cbfc856b9668071c.png)
选择数据集参数,将需要传参的参数设置上去(参数顺序和自定义数据集类中的顺序一致)
![](https://img.haomeiwen.com/i14922812/18c0b1cce6cd82df.png)
6. 报表设计
![](https://img.haomeiwen.com/i14922812/36f9ea428fb830d8.png)
A3表达式 =ds.select(#0) ,扩展方向为纵向扩展
B2表达式 =parting(@fields,','),扩展方向为横向扩展
B3表达式=eval("ds.getone("+B2+",#0=A3)")
7. Web预览
![](https://img.haomeiwen.com/i14922812/5dec4e12a27a4879.png)
8. 读取json数据成功。
9. 将brt文件、fastjson jar包和自定义数据集jar包复制到 web应用中。
网友评论