使用jsonpath从kettle转换json2csv
来源:互联网 发布:中国平安管培生 知乎 编辑:程序博客网 时间:2024/04/29 02:20
保存配置后,运行即可。
对应的解析json也类似xml的解析:
一:如果是文件数据的话,选择对应的文件;如果是流利的字段,配置好相应的字段即可。
二:配置好路径,读取json即可。
解析json的具体示例如下:
使用jsonpath解析json内容
JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的json内容。下面我把官网介绍的每个表达式用代码实现,可以更直观的知道该怎么用它。
一.首先需要依赖的jar包
二.因为编译的时候会报log4j的警报,所以需要在项目的src目录下新建log4j.properties文件,内容如下:
log4j.rootLogger=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
三.准备一个json文本
{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99 } ], "bicycle": { "color": "red", "price": 19.95 } }, "expensive": 10}
四.我们从代码中分析用法,代码如下
package com.jsonpath;import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.util.Iterator;import java.util.List;import java.util.Map;import net.minidev.json.JSONArray;import com.jayway.jsonpath.Configuration;import com.jayway.jsonpath.JsonPath;import com.jayway.jsonpath.ReadContext;/** * @author QiaoJiafei * @version 创建时间:2016年3月2日 下午3:37:42 * 类说明 */public class TestJsonPath { public static void main(String[] args) { // TODO Auto-generated method stub String sjson = readtxt(); //String sjson = "{\"store\": {\"book\": [{\"category\": \"reference\",\"author\": \"Nigel Rees\",\"title\": \"Sayings of the Century\",\"price\": 8.95},{\"category\": \"fiction\",\"author\": \"Evelyn Waugh\",\"title\": \"Sword of Honour\",\"price\": 12.99},{\"category\": \"fiction\",\"author\": \"Herman Melville\",\"title\": \"Moby Dick\",\"isbn\": \"0-553-21311-3\",\"price\": 8.99},{\"category\": \"fiction\",\"author\": \"J. R. R. Tolkien\",\"title\": \"The Lord of the Rings\",\"isbn\": \"0-395-19395-8\",\"price\": 22.99}],\"bicycle\": {\"color\": \"red\",\"price\": 19.95}},\"expensive\": 10}"; /* print("--------------------------------------getJsonValue0--------------------------------------"); getJsonValue0(sjson); print("--------------------------------------getJsonValue1--------------------------------------"); getJsonValue1(sjson); print("--------------------------------------getJsonValue2--------------------------------------"); getJsonValue2(sjson); print("--------------------------------------getJsonValue3--------------------------------------"); getJsonValue3(sjson); print("--------------------------------------getJsonValue4--------------------------------------"); getJsonValue4(sjson); */ print("--------------------------------------getJsonValue--------------------------------------"); getJsonValue(sjson); } private static String readtxt() { // TODO Auto-generated method stub StringBuilder sb = new StringBuilder(); try { FileReader fr = new FileReader("D:/workspace/PressureTest/json.txt"); BufferedReader bfd = new BufferedReader(fr); String s = ""; while((s=bfd.readLine())!=null) { sb.append(s); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(sb.toString()); return sb.toString(); } private static void getJsonValue(String json) { //The authors of all books:获取json中store下book下的所有author值 List<String> authors1 = JsonPath.read(json, "$.store.book[*].author"); //All authors:获取所有json中所有author的值 List<String> authors2 = JsonPath.read(json, "$..author"); //All things, both books and bicycles //authors3返回的是net.minidev.json.JSONArray:获取json中store下的所有value值,不包含key,如key有两个,book和bicycle List<Object> authors3 = JsonPath.read(json, "$.store.*"); //The price of everything:获取json中store下所有price的值 List<Object> authors4 = JsonPath.read(json, "$.store..price"); //The third book:获取json中book数组的第3个值 List<Object> authors5 = JsonPath.read(json, "$..book[2]"); //The first two books:获取json中book数组的第1和第2两个个值 List<Object> authors6 = JsonPath.read(json, "$..book[0,1]"); //All books from index 0 (inclusive) until index 2 (exclusive):获取json中book数组的前两个区间值 List<Object> authors7 = JsonPath.read(json, "$..book[:2]"); //All books from index 1 (inclusive) until index 2 (exclusive):获取json中book数组的第2个值 List<Object> authors8 = JsonPath.read(json, "$..book[1:2]"); //Last two books:获取json中book数组的最后两个值 List<Object> authors9 = JsonPath.read(json, "$..book[-2:]"); //Book number two from tail:获取json中book数组的第3个到最后一个的区间值 List<Object> authors10 = JsonPath.read(json, "$..book[2:]"); //All books with an ISBN number:获取json中book数组中包含isbn的所有值 List<Object> authors11 = JsonPath.read(json, "$..book[?(@.isbn)]"); //All books in store cheaper than 10:获取json中book数组中price<10的所有值 List<Object> authors12 = JsonPath.read(json, "$.store.book[?(@.price < 10)]"); //All books in store that are not "expensive":获取json中book数组中price<=expensive的所有值 List<Object> authors13 = JsonPath.read(json, "$..book[?(@.price <= $['expensive'])]"); //All books matching regex (ignore case):获取json中book数组中的作者以REES结尾的所有值(REES不区分大小写) List<Object> authors14 = JsonPath.read(json, "$..book[?(@.author =~ /.*REES/i)]"); //Give me every thing:逐层列出json中的所有值,层级由外到内 List<Object> authors15 = JsonPath.read(json, "$..*"); //The number of books:获取json中book数组的长度 List<Object> authors16 = JsonPath.read(json, "$..book.length()"); print("**************authors1**************"); print(authors1); print("**************authors2**************"); print(authors2); print("**************authors3**************"); printOb(authors3); print("**************authors4**************"); printOb(authors4); print("**************authors5**************"); printOb(authors5); print("**************authors6**************"); printOb(authors6); print("**************authors7**************"); printOb(authors7); print("**************authors8**************"); printOb(authors8); print("**************authors9**************"); printOb(authors9); print("**************authors10**************"); printOb(authors10); print("**************authors11**************"); printOb(authors11); print("**************authors12**************"); printOb(authors12); print("**************authors13**************"); printOb(authors13); print("**************authors14**************"); printOb(authors14); print("**************authors15**************"); printOb(authors15); print("**************authors16**************"); printOb(authors16); } /** * 读取json的一种写法,得到匹配表达式的所有值 * */ private static void getJsonValue0(String json) { // TODO Auto-generated method stub List<String> authors = JsonPath.read(json, "$.store.book[*].author"); //System.out.println(authors.size()); print(authors); } /** * 读取json的一种写法,得到某个具体值 * */ private static void getJsonValue1(String json) { Object document = Configuration.defaultConfiguration().jsonProvider().parse(json); String author0 = JsonPath.read(document, "$.store.book[0].author"); String author1 = JsonPath.read(document, "$.store.book[1].author"); print(author0); print(author1); } /** * 读取json的一种写法 * */ private static void getJsonValue2(String json) { ReadContext ctx = JsonPath.parse(json); List<String> authorsOfBooksWithISBN = ctx.read("$.store.book[?(@.isbn)].author"); List<Map<String, Object>> expensiveBooks = JsonPath .using(Configuration.defaultConfiguration()) .parse(json) .read("$.store.book[?(@.price > 10)]", List.class); print(authorsOfBooksWithISBN); print("****************Map****************"); printListMap(expensiveBooks); } /** *读取json的一种写法 *得到的值是一个String,所以不能用List存储 * */ private static void getJsonValue3(String json) { //Will throw an java.lang.ClassCastException //List<String> list = JsonPath.parse(json).read("$.store.book[0].author"); //由于会抛异常,暂时注释上面一行,要用的话,应使用下面的格式 //Works fine String author = JsonPath.parse(json).read("$.store.book[0].author"); print(author); } /** *读取json的一种写法 *支持逻辑表达式,&&和|| * */ private static void getJsonValue4(String json) { List<Map<String, Object>> books1 = JsonPath.parse(json) .read("$.store.book[?(@.price < 10 && @.category == 'fiction')]"); List<Map<String, Object>> books2 = JsonPath.parse(json) .read("$.store.book[?(@.category == 'reference' || @.price > 10)]"); print("****************books1****************"); printListMap(books1); print("****************books2****************"); printListMap(books1); } private static void print(List<String> list) { for(Iterator<String> it = list.iterator();it.hasNext();) { System.out.println(it.next()); } } private static void printOb(List<Object> list) { for(Iterator<Object> it = list.iterator();it.hasNext();) { print("****"); System.out.println(it.next()); } } private static void printListMap(List<Map<String, Object>> list) { for(Iterator<Map<String, Object>> it = list.iterator();it.hasNext();) { Map<String, Object> map = it.next(); print("****"); for(Iterator iterator =map.entrySet().iterator();iterator.hasNext();) { System.out.println(iterator.next()); } } } private static void print(String s) { System.out.println(s); } }
1.首先我们看getJsonValue()这个方法的输出结果:
--------------------------------------getJsonValue--------------------------------------**************authors1**************Nigel ReesEvelyn WaughHerman MelvilleJ. R. R. Tolkien**************authors2**************Nigel ReesEvelyn WaughHerman MelvilleJ. R. R. Tolkien**************authors3**************[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}]{color=red, price=19.95}**************authors4**************8.9512.998.9922.9919.95**************authors5**************{category=fiction, author=Herman Melville, title=Moby Dick, isbn=0-553-21311-3, price=8.99}**************authors6**************{category=reference, author=Nigel Rees, title=Sayings of the Century, price=8.95}{category=fiction, author=Evelyn Waugh, title=Sword of Honour, price=12.99}**************authors7**************{category=reference, author=Nigel Rees, title=Sayings of the Century, price=8.95}{category=fiction, author=Evelyn Waugh, title=Sword of Honour, price=12.99}**************authors8**************{category=fiction, author=Evelyn Waugh, title=Sword of Honour, price=12.99}**************authors9**************{category=fiction, author=Herman Melville, title=Moby Dick, isbn=0-553-21311-3, price=8.99}{category=fiction, author=J. R. R. Tolkien, title=The Lord of the Rings, isbn=0-395-19395-8, price=22.99}**************authors10**************{category=fiction, author=Herman Melville, title=Moby Dick, isbn=0-553-21311-3, price=8.99}{category=fiction, author=J. R. R. Tolkien, title=The Lord of the Rings, isbn=0-395-19395-8, price=22.99}**************authors11**************{category=fiction, author=Herman Melville, title=Moby Dick, isbn=0-553-21311-3, price=8.99}{category=fiction, author=J. R. R. Tolkien, title=The Lord of the Rings, isbn=0-395-19395-8, price=22.99}**************authors12**************{category=reference, author=Nigel Rees, title=Sayings of the Century, price=8.95}{category=fiction, author=Herman Melville, title=Moby Dick, isbn=0-553-21311-3, price=8.99}**************authors13**************{category=reference, author=Nigel Rees, title=Sayings of the Century, price=8.95}{category=fiction, author=Herman Melville, title=Moby Dick, isbn=0-553-21311-3, price=8.99}**************authors14**************{category=reference, author=Nigel Rees, title=Sayings of the Century, price=8.95}**************authors15**************{book=[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}], bicycle={color=red, price=19.95}}10[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}]{color=red, price=19.95}{category=reference, author=Nigel Rees, title=Sayings of the Century, price=8.95}{category=fiction, author=Evelyn Waugh, title=Sword of Honour, price=12.99}{category=fiction, author=Herman Melville, title=Moby Dick, isbn=0-553-21311-3, price=8.99}{category=fiction, author=J. R. R. Tolkien, title=The Lord of the Rings, isbn=0-395-19395-8, price=22.99}referenceNigel ReesSayings of the Century8.95fictionEvelyn WaughSword of Honour12.99fictionHerman MelvilleMoby Dick0-553-21311-38.99fictionJ. R. R. TolkienThe Lord of the Rings0-395-19395-822.99red19.95**************authors16**************4
2.然后看getJsonValue0()、getJsonValue1()、getJsonValue2()、getJsonValue3()、getJsonValue4()的输出结果
--------------------------------------getJsonValue0--------------------------------------Nigel ReesEvelyn WaughHerman MelvilleJ. R. R. Tolkien--------------------------------------getJsonValue1--------------------------------------Nigel ReesEvelyn Waugh--------------------------------------getJsonValue2--------------------------------------Herman MelvilleJ. R. R. Tolkien****************Map********************category=fictionauthor=Evelyn Waughtitle=Sword of Honourprice=12.99****category=fictionauthor=J. R. R. Tolkientitle=The Lord of the Ringsisbn=0-395-19395-8price=22.99--------------------------------------getJsonValue3--------------------------------------Nigel Rees--------------------------------------getJsonValue4--------------------------------------****************books1********************category=fictionauthor=Herman Melvilletitle=Moby Dickisbn=0-553-21311-3price=8.99****************books2********************category=fictionauthor=Herman Melvilletitle=Moby Dickisbn=0-553-21311-3price=8.99
3.相应的解释已经在代码中注释,更多的用法详见官网链接:https://github.com/jayway/JsonPath
4.如果只是想简单的处理json,也可以使用JSONObject和JSONArray,具体用法详见我的这篇文章:http://www.cnblogs.com/qiaoyeye/p/4730930.html
----------更新2016年08月19日10:06:09-------
You can use &&
and ||
to combine multiple predicates [?(@.price < 10 && @.category == 'fiction')]
, [?(@.category == 'reference' || @.price > 10)]
这个好厉害,可以这样用
JsonPath.read(json, "$..farePrices[?(@.priceType == 'SalePrice' && @.passengerType == 'ADULT')].amount");
- 使用jsonpath从kettle转换json2csv
- JsonPath的使用
- JsonPath的使用
- JsonPath使用教程
- fastJson 之 JSONPath使用
- JsonPath
- jsonpath
- fastjson使用(九) -- JSONPath使用
- 使用jsonpath解析json内容
- 使用JsonPath解析json数据
- 【Kettle从零开始】第四弹之Kettle转换数据抽取使用
- 使用Kettle从FTP拉取文件
- json解析神器 jsonpath的使用
- Kettle使用
- kettle使用
- 使用kettle将数据从excel存入数据库
- 使用Kettle从本地上传文件到远程HDFS
- 使用Kettle从国家统计局下载行政区划代码数据
- antd-mobile
- HTML5的 input:file上传类型控制
- Android--自定义Button的样式以及动态渐变效果
- 一个特殊的android横向布局
- RxJava /RxAndroid
- 使用jsonpath从kettle转换json2csv
- linux中文件颜色和类型说明
- sqlplus 连接Oracle 乱码的 解决方法
- 【mysql 用户权限管理】mysql 权限管理学习
- c++ 单例
- bzoj 3329: Xorequ 数位dp+矩阵乘法
- 《Android源码设计模式解析与实战》读书笔记(十九)——组合模式
- 多线程
- 【脚本语言系列】关于Python多线程编程Threading, 你需要知道的事