json

阅读(4936) 标签: json, httpfile,

作为常见的数据交换格式,json格式的数据可能自于外部Java程序、本地文件或者http服务器。集算器可以很简便的解析和计算json格式字符串。

这里通过几个例子来看一下,集算器脚本具体的写法。

首先看json字符串从外部Java程序以参数的形式传入的情况。

例如:待处理字符串是json格式的员工信息,包含EIDNAMESURNAMEGENDERSTATEBIRTHDAYHIREDATEDEPT等字段,这个例子要解析数据,按条件找出198111日(含)之后出生的女员工。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程序。

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

where是个字串,其值是:BIRTHDAY>=date(1981,1,1) && GENDER=="F"

注意:jsonstr是个字串,输入值时需要在json字符串前添加单引号'表示其类型是字符串。

esProc代码如下:

 

A

 

1

=json(jsonstr)

2

=A1.select(${where})

3

=A2.export@j()

[{EID:4,NAME:"Emily",SURNAME:"Smith",GENDER:"F",STATE:"Texas",BIRTHDAY:1985-03-07,HIREDATE:2006-08-15,DEPT:"HR",SALARY:7000}…]

4

return A3

 

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

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

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

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

Java程序中调用上述esProc脚本的方法,参见esProc教程。

再看json数据来自HTTP服务器的情况。假设有一个testServlet可以返回json格式的员工信息字符串,可以用下面的代码获取、计算:

 

A

1

=httpfile("http://localhost:6080/myweb/servlet/testServlet?table=employee&type=json")

2

=A1.read()

3

=json(A2)

4

=A3.select(${where})

5

=json(A4)

6

return A5

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

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

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

A4:按照条件过滤数据。

A5:将过滤后的序表转换为json格式字符串,json函数将自动判断参数类型,执行json串的导入或导出。

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

最后,如果json格式数据包含嵌套对象,集算器也可以解析、计算。例如:json格式的blog信息中嵌套的评论信息,集算器可以解析为字段引用。Blogs.json文件数据内容如下:

[ 

{  "id" : 1000,

"content" : "It is too hot",

"comment" :

[

{

"author" : "joe",

"score" : 3,

"comment" : "just so so!"

},

{

"author" : "jimmy",

"score" : 5, "comment" : "cool! good!"

}

]

},

{  "id" : 1001,

"content" : "It is too cold",

"comment" :

[

{

"author" : "james",

"score" : 1,

"comment" : "yes!"

},

{

"author": "jimmy",

"score" : 5,

"comment" : "cool!"

}

]

},

{  "id" : 1002,

"content" : "It is windy day today",

"comment" :

[

{

"author" : "tom",

"score" : 3,

"comment" : "I do not thinkso!"

},

{

"author" : "jimmy",

"score" : 5,

"comment" : "cool!"

}

]

}

]

使用集算器编辑器编写脚本读取json格式文件,解析内容并完成计算的脚本如下:

 

A

1

=json(file("D:/files/work/txt/blogs.json").read())

取出结果序表后发现,comment字段是个引用字段,引用了一个序表,如下图:

当我们双击第一行蓝色部分的时候,可以详细查看这个引用序表,如下图:

对于这个带引用字段的序表,集算器可以进一步进行复杂的集合运算。