kettle庖丁解牛第14篇之JSON输入

Posted 飞哥大数据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kettle庖丁解牛第14篇之JSON输入相关的知识,希望对你有一定的参考价值。

引言

上一篇文章中,我们介绍了:XML和XPath的那些事,然后又讲解了XML文件输入组件的各种详细设置,最后实战演示了如何操作它来读取磁盘上的xml文件。

在本篇文章中,我们接着介绍:kettle中的JSON输入组件(JSON inpu)。

要想学明白JSON输入组件,我们就要扩展着聊聊JSON和JSONPath那些事了。

JSON简介

JSON的全称是"javascript Object Notation",意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。XML也是一种数据交换格式,为什么没有选择XML呢?

因为XML虽然可以作为跨平台的数据交换格式,但是在JS(JavaScript的简写)中处理XML非常不方便,同时XML标记比数据多,增加了交换产生的流量,而JSON没有附加的任何标记,在JS中可作为对象处理,所以更倾向于选择JSON来交换数据。

JSON3种数据结构

键值对

键值对是JSON中最基本的数据结构

 "Name": "大飞哥"

在上面的例子中属性"Name"是用一对双引号括起来的一个字符串。而它的值"大飞哥"在这个例子中也是一个字符串,当然它还可以是其他类型。

对象

一个JSON对象是包含了一组未排序键值对的集合。

        "person" :

        "age" : "35",

        "sex" : "男",

        "name" : "大飞哥",

        "weight" : "75kg",

        "height" : "170cm"

                         

       

上面的例子中person对象包含了5个属性,它们之间用,进行分割。

数组

JSON中用[]来表示数组元素

          "people" : [

                              "firstName": "大", "lastName": "飞哥", "age": 35 ,

                              "firstName": "大", "lastName": "数据", "age": 32

                         ]

       

JSON6种数据类型

string类型

字符串,必须要用双引号引起来。

number类型

数值,与JavaScript的number一致,整数(不使用小数点或指数计数法)最多为15位,小数的最大位数是17。

object类型

JavaScript的对象形式, key:value表示方式,可嵌套。

array类型

数组,JavaScript的Array表示方式[value],可嵌套。

布尔类型

true/false,JavaScript的boolean类型。

null类型

空值,JavaScript的null。

JSON的优缺点

优点

a、数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;

b、易于解析,客户端JavaScript可以通过eval()进行JSON数据的读取;  

c、支持多种语言,便于服务器端的解析;    

d、直接为服务器端代码使用,简化服务器端和客户端的代码开发量,并且易于维护。

缺点

a、没有XML格式推广的好,没有XML那么通用性;  

b、JSON格式目前在Web Service中,推广还属于初级阶段。

JSON相关网址

json中文官网

http://www.json.org/json-zh.html

json官网

http://www.json.org/

JSONPath那些事

JsonPath是一种简单的方法来提取给定JSON文档的部分内容。 JsonPath有许多编程语言,如Javascript,Python和php,Java。

JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有想要获得的json内容。

操作符

操作

说明

$

查询根元素。这将启动所有路径表达式。

@

当前节点由过滤谓词处理。

*

通配符,必要时可用任何地方的名称或数字。

..

深层扫描。 必要时在任何地方可以使用名称。

.<name>

点,表示子节点

[<name> (, <name>)]

括号表示子项

[<number> (, <number>)]

数组索引或索引

[start:end]

数组切片操作

[?(<expression>)]

过滤表达式。 表达式必须求值为一个布尔值。

函数

可以在路径的尾部调用,函数的输出是路径表达式的输出,该函数的输出是由函数本身所决定的。

函数

描述

输出

min()

提供数字数组的最小值

Double

max()

提供数字数组的最大值

Double

avg()

提供数字数组的平均值

Double

stddev()

提供数字数组的标准偏差值

Double

length()

提供数组的长度

Integer

过滤器运算符

过滤器是用于筛选数组的逻辑表达式。

操作符

描述

==

left等于right(注意1不等于1)

!=

不等于

<

小于

<=

小于等于

>

大于

>=

大于等于

=~

匹配正则表达式[?(@.name =~ /foo.*?/i)]

in

左边存在于右边 [?(@.size in [S, M])]

nin

左边不存在于右边

size

(数组或字符串)长度

empty

(数组或字符串)为空

JSONPath使用举例

JSON原数据

[

    "id": "PRIMARY",

    "name": "小学",

    "front_id": "PRIMARY",

    "front_name": "小学"

,

    "id": "JUNIOR",

    "name": "初中",

    "front_id": "JUNIOR",

    "front_name": "初中"

,

    "id": "HIGH",

    "name": "高中",

    "front_id": "HIGH",

    "front_name": "高中"

,

    "id": "TECHNICAL",

    "name": "中专/技校",

    "front_id": "TECHNICAL",

    "front_name": "中专/技校"

,

    "id": "COLLEGE",

    "name": "大专",

    "front_id": "COLLEGE",

    "front_name": "大专"

,

    "id": "BACHELOR",

    "name": "本科",

    "front_id": "BACHELOR",

    "front_name": "本科"

,

    "id": "MASTER",

    "name": "硕士",

    "front_id": "MASTER",

    "front_name": "硕士"

,

    "id": "DOCTOR",

    "name": "博士",

    "front_id": "DOCTOR",

    "front_name": "博士"

]

JSONPath获取数据

JSONPath表达式

结果

$.[*].name

所有学历的name

$.[*].id

所有的id

$.[*]

所有元素

$.[(@.length-2)].name

倒数第二个元素的name

$.[2]

第三个元素

$.[(@.length-1)]

最后一个元素

$.[0,1]

$.[:2]

前面的两个元素

$.[?(@.name =~ /.*大专/i)]

 过滤出所有的name包含“大专”的。

$.[*].length()

所有元素的个数

JSON和JSONPath的讲解,主要为了我们下面要讲的JSON input做铺垫,我们走起来吧!

转换

转换(transaformation)是ETL解决方案中最主要的部分,它处理抽取、转换、加载各种对数据行的操作。

创建转换

我们要做的ETL操作,全是在转换中设计的,所以我们要先创建一个转换。

kettle庖丁解牛第14篇之JSON输入_json

kettle庖丁解牛第14篇之JSON输入_json

保存转换

kettle庖丁解牛第14篇之JSON输入_jsonpath_03

给你新建的转换,起个名字,并保存

kettle庖丁解牛第14篇之JSON输入_kettle_04

kettle庖丁解牛第14篇之JSON输入_kettle_05

JSON输入

此组件可以实现,从指定的JSON文件输入数据。

kettle庖丁解牛第14篇之JSON输入_json_06

kettle庖丁解牛第14篇之JSON输入_json输入_07

a、文件指定

1、文件标签指定数据源文件,点击“浏览”按钮,浏览本地的json文件。点击"增加"按钮,你可以添加一个文件到"选择文件"中,如下所示:

kettle庖丁解牛第14篇之JSON输入_json

kettle庖丁解牛第14篇之JSON输入_kettle_09

kettle庖丁解牛第14篇之JSON输入_jsonpath_10

kettle庖丁解牛第14篇之JSON输入_json输入_11

选项说明

选项

描述

源定义在一个字段里

选择从前面定义的字段检索源。选择后,设置一下字段可用:Select field(从字段获取源)、Use field as file names(源是一个文件名?)、Read source as URL(以Url获取源?)、Do not pass field downstream。当这个选项禁用,以下字段是可用:File or directory(文件或路径)、Regular Expression(正则表达式)、Exclude Regular Expression(正则表达式(排除))、Selected files(选中的文件)。

从字段获取源

在前面的步骤中指定要用作源的字段名。

源是一个文件名

选中表示源是文件名。

以Url获取源

选中表示是否应该以URL的形式访问源。

Do not pass field downstream

选择将源字段从输出流中移除。此操作提高了大型JSON字段的性能和内存利用率。

文件或路径

如果源未在字段中定义,请指定源位置。单击浏览(B)导航到源文件或目录。单击增加(A)以在选中的文件列表中包含源。

正则表达式

指定一个正则表达式来匹配指定目录中的文件名。

正则表达式(排除)

指定一个正则表达式以排除指定目录中的文件名。

b、内容

kettle庖丁解牛第14篇之JSON输入_json输入_12

选项说明

选项

描述

忽略空文件

选择跳过空文件。清除后,空文件将导致进程失败并停止。

如果没有文件不要报告错误

当没有文件可供处理时,选择继续。

忽略不完整的路径

当出现错误(1)没有字段匹配JSON路径或(2)所有值都为null时,选择继续处理文件。清除后,发生错误时不再处理其他行。

Default path leaf to null

如果选中,为缺少的路径返回一个null值。

以上是关于kettle庖丁解牛第14篇之JSON输入的主要内容,如果未能解决你的问题,请参考以下文章

kettle庖丁解牛第27篇之多种数据源统一输出

kettle庖丁解牛第10篇之表输入

kettle庖丁解牛第5篇之文本文件输入

kettle庖丁解牛第13篇之XML文件输入

kettle庖丁解牛第21篇之SQL文件输出

kettle庖丁解牛第2篇之初识kettle

(c)2006-2024 SYSTEM All Rights Reserved IT常识