zoukankan      html  css  js  c++  java
  • 集算器协助java处理多样性数据源之JSON

        Java的json开源包一般只能解析json数据,没有运算功能。程序员自己写通用的程序来实现分组、排序、过滤、连接这些计算,相当麻烦。例如:用java写json文件条件过滤程序时,当条件表达式发生变化时就需要改写代码。如果要实现象SQL那样灵活的条件过滤,则需要自己实现动态表达式解析和求值,编程工作量非常大。

        集算器是支持动态表达式的,可以嵌入到Java中写出通用的json计算程序。下面我们通过例子来看一下具体作法。待处理字符串是json格式的员工信息,包含EID、NAME、SURNAME、GENDER、STATE、BIRTHDAY、HIREDATE、DEPT等字段,这个例子要解析数据,按条件找出1981年1月1日(含)之后出生的女员工。Json字符串内容如下:

        [{EID:1,NAME:"Rebecca",SURNAME:"Moore",GENDER:"F",STATE:"California ",BIRTHDAY:1974-11-20,HIREDATE:2005-03-11,DEPT:"R&D",SALARY:7000},
        {EID:2,NAME:"Ashley",SURNAME:"Wilson",GENDER:"F",STATE:"New York",BIRTHDAY:1980-07-19,HIREDATE:2008-03-16,DEPT:"Finance",SALARY:11000},
        {EID:3,NAME:"Rachel",SURNAME:"Johnson",GENDER:"F",STATE:"New Mexico",BIRTHDAY:1970-12-17,HIREDATE:2010-12-01,DEPT:"Sales",SALARY:9000},…]

        实现的思路是:Java程序调用集算器程序并传入json字符串,集算器解析json格式数据完成条件过滤,之后将结果以json字符串的方式返回给Java程序。由于集算器支持动态表达式解析和求值,使得Java程序可以像使用sql那样,灵活的过滤json数据。

        例如,我们需要查询1981年1月1日(含)之后出生的女员工,esProc程序可以从外部获得两个输入参数“jsonstr”和“where”条件,如下图:

        where是个字串,其值是:BIRTHDAY>=date(1981,1,1) && GENDER==”F”。
        esProc代码如下:

        A1:把json格式数据解析成序表。esProc的集成开发环境可以直观的显示出计算结果,如上图右边部分。

        A2:按照条件过滤。这里使用宏来实现动态解析表达式,其中的where就是传入参数。集算器先计算${…}里的表达式,将计算结果作为宏字符串值替换${…}之后解释执行。这个例子中最终执行的是:=A1.select(BIRTHDAY>=date(1981,1,1) && GENDER==”F”)。

        A3:将过滤之后的序表生成json格式字符串。

        A4:向外部程序返回符合条件的结果集。

        过滤条件发生变化时不用改变代码,只需改变where参数即可。例如,条件变为:查询1981年1月1日(含)之后出生的女员工,或者NAME+SURNAME等于”RebeccaMoore”的员工。Where的参数值可以写为:BIRTHDAY>=date(1981,1,1) && GENDER==”F” || NAME+SURNAME==”RebeccaMoore”。执行之后,A2中的结果集如下图:

        由于在Java程序中调用esProc脚本是通过jdbc接口完成的,返回结果是一个ResultSet对象set。取得set的第一个字符串字段,就是过滤之后的json字符串。具体代码如下:(将上述esProc程序保存为test.dfx):

            //建立连接
             Class.forName(“com.esproc.jdbc.InternalDriver”);
         con= DriverManager.getConnection(“jdbc:esproc:local://”);
         //调用存储过程,其中test是dfx的文件名
         com.esproc.jdbc.InternalCStatement st;
         st =(com. esproc.jdbc.InternalCStatement)con.prepareCall(“call json(?,?)”);
         //设置参数,json字符串较长,省略部分。
         //在实际应用中json字符串可能由各种不同的方式生成,说明见后。
         String jsonstr=
         “[{EID:1,NAME:"Rebecca",SURNAME:"Moore",GENDER:"F",STATE:"California...}]“;
         st.setObject(1,jsonstr);
         st.setObject(2,”BIRTHDAY>=date(1981,1,1) && GENDER==”F”");
         //执行集算器存储过程
         ResultSet set=st.executeQuery();
         //获取过滤之后的json格式字符串
    String jsonstrResult;
    if(set.next()) jsonstrResult = set.getString(1);

        Json是互联网应用中交换数据的常用格式,在实际应用当中,json字符串可能来自本地文件或远程的HTTP服务器,集算器可以直接从文件或HTTP服务器读取json字符串。以HTTP服务器为例,假设有一个testServlet可以返回json格式的员工信息字符串,则可以用下面的代码获取、计算:

        A1:定义了httpfile对象,url是 http://localhost:6080/myweb/servlet/testServlet?table=employee&type=json

        A2:读取httpfile对象返回的结果。

        A3:解析json格式字符串,生成一个序表。

        A4:按照条件过滤数据。

        A5:将过滤后的序表转换为json格式字符串。

        A6:将A4中的结果返回给调用这段集算器程序的Java代码。

  • 相关阅读:
    密码由6-12位数字或字母组成,密码哈希加密
    获得一个字符串的汉语拼音码
    WPF中ComboBox绑定数据库自动读取产生数据
    SQL存储过程生成顺序编码
    SQL 语句调用这个存储过程,生成顺序编码
    restful(1):序列化
    Django的CBV和FBV
    权限管理组件:rbac
    ModelForm组件和forms组件补充
    BBS+Blog项目代码
  • 原文地址:https://www.cnblogs.com/raqsoft/p/5123228.html
Copyright © 2011-2022 走看看