437 Star 2K Fork 855

youseries / ureport

 / 详情

JSON数组解析问题

待办的
创建于  
2022-03-17 22:32

为了您的问题能得到及时准确解答,请认真填写下面各个选项,感谢您的配合。

  • 当前使用的UReport的具体版本号:

版本号2.2.9

  • 遇到的问题描述:

通过数据库查询出来的字符串为JSONArray字符串
[{"DRUG":"硝苯地平","USAGE":"qd","DOSAGE":"1u"},{"DRUG":"阿托伐他汀","USAGE":"qd","DOSAGE":"1u"}]
json函数只能针对JSONObjcet进行解析,JSONArray应该怎么解析?

  • 涉及到的异常信息(完整异常信息):

  • 相关截图:

评论 (1)

vongkong 创建了任务

自己实现
bean模式,data -> 数据集名称
比如:
{"infos" : ["aa" , "bb" , "cc"] , "names" : [{"name" : "n1"} , {"name" : "n2"}]}
例子:
1.json2(data.select(infos))
2.json2(data.select(names) , "name")

public class JsonFunctionExt implements Function {

    public Object execute(List<ExpressionData<?>> dataList, Context context, Cell currentCell) {
        if (dataList.size() != 2) {
            if(dataList.size() == 1){
                Object obj = dataList.get(0);
                if(obj instanceof BindDataListExpressionData){
                    return ((BindDataListExpressionData) obj).getData().get(0).getValue();
                }else if(obj instanceof ObjectListExpressionData){
                    return ((ObjectListExpressionData)obj).getData().get(0);
                }
            }
            return null;
        } else {
            List<String> objs = this.buildData(dataList.get(0));
            String property = this.buildProperty(dataList.get(1));
            if (CollectionUtil.isNotEmpty(objs)) {
                ObjectMapper mapper = new ObjectMapper();
                List<Object> list = new ArrayList<>();
                try {
                    for (String obj : objs) {
                        Map<?, ?> map = (Map) mapper.readValue(obj, HashMap.class);
                        list.add(Utils.getProperty(map, property));
                    }
                    return list;
                } catch (Exception var8) {
                    throw new ReportException(var8);
                }
            } else {
                return null;
            }
        }
    }

    private List<String> buildData(ExpressionData<?> exprData) {
        List<String> objs = new ArrayList<>();
        if (exprData instanceof ObjectExpressionData) {
            ObjectExpressionData objData = (ObjectExpressionData) exprData;
            Object data = objData.getData();
            if (data != null) {
                objs.add(JSONUtil.toJsonStr(data));
            }
        } else {
            if (exprData instanceof ObjectListExpressionData || exprData instanceof BindDataListExpressionData) {
                List list = (List) exprData.getData();

                for (Object data : list) {
                    if (!(data instanceof BindData)) {
                        data = new BindData(data);
                    }
                    Object tmp = ((BindData) data).getValue();
                    if (tmp instanceof List) {
                        List values = (List) tmp;
                        for (Object t : values) {
                            objs.add(JSONUtil.toJsonStr(t));
                        }
                    } else {
                        objs.add(JSONUtil.toJsonStr(tmp));
                    }
                }
            }
        }

        return objs.stream().filter(e -> StrUtil.isNotBlank(e)).filter(Objects::nonNull).collect(Collectors.toList());
    }

    private String buildProperty(ExpressionData<?> exprData) {
        String obj = null;
        if (exprData instanceof ObjectExpressionData) {
            ObjectExpressionData objData = (ObjectExpressionData) exprData;
            Object data = objData.getData();
            if (data != null) {
                obj = data.toString();
            }
        } else {
            Object data;
            List list;
            if (exprData instanceof ObjectListExpressionData) {
                ObjectListExpressionData listData = (ObjectListExpressionData) exprData;
                list = listData.getData();
                if (list.size() == 1) {
                    data = list.get(0);
                    if (data != null) {
                        obj = data.toString();
                    }
                }
            } else if (exprData instanceof BindDataListExpressionData) {
                BindDataListExpressionData listData = (BindDataListExpressionData) exprData;
                list = listData.getData();
                if (list.size() == 1) {
                    data = ((BindData) list.get(0)).getValue();
                    if (data != null) {
                        obj = data.toString();
                    }
                }
            }
        }

        return obj;
    }

    public String name() {
        return "json2";
    }
}


@Configuration
public class UReport2Config {
    @Bean
    public Function ureportJsonFunctionExt() {
        return new JsonFunctionExt();
    }
}

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
Java
1
https://gitee.com/youseries_admin/ureport.git
git@gitee.com:youseries_admin/ureport.git
youseries_admin
ureport
ureport

搜索帮助