当前位置:   article > 正文

根据json路径规则获取json任意节点信息(工具向)_java 指定节点path 获取json

java 指定节点path 获取json

做这个的目的?

        基于接口的质量检核,需要对接口数据进行标准化(类似表结构)。由于接口数据由数据共享平台拦截接口保存数据,故各种接口的返回数据形式各不相同,为了质量检核得以实现,对拦截的接口数据进行相应的实体抽取得到标准化数据

举个栗子

        假设有如下数据:

  1. {
  2. "code": "200",
  3. "total": 1,
  4. "data": [
  5. {
  6. "people":{
  7. "name":"SS",
  8. "age":10,
  9. "sex":"F",
  10. "address":{
  11. "country":"中国",
  12. "city":"重庆市",
  13. "street":"皇室桀骜"
  14. }
  15. }
  16. },{
  17. "people":{
  18. "name":"SS",
  19. "age":10,
  20. "sex":"F",
  21. "address":{
  22. "country":"中国",
  23. "city":"重庆市",
  24. "street":"皇室桀骜"
  25. }
  26. }
  27. },{
  28. "people":{
  29. "name":"SS",
  30. "age":10,
  31. "sex":"F",
  32. "address":{
  33. "country":"中国",
  34. "city":"重庆市",
  35. "street":"皇室桀骜"
  36. }
  37. }
  38. },{
  39. "people":{
  40. "name":"SS",
  41. "age":10,
  42. "sex":"F",
  43. "address":{
  44. "country":"中国",
  45. "city":"重庆市",
  46. "street":"皇室桀骜"
  47. }
  48. }
  49. }
  50. ]
  51. }

        假设我需要拿到address的相关信息。我的json路径就是data.people.address

但是需要对每个people进行解析取出address,所以为了快速取出数据,根据路径,定制了下面的规则。

        同样以取address为目标,规则路径为data[?].people.address ;data为key,[]代表数组,?代表data下的每一个对象都需要进行解析,如果为数字0,1,2则表示取第几个元素。

程序实现

        由于数据层级与数据是对象还是数组的不确定性,所以采用递归的方式进行实现

  1. package org.zxhy.tool;
  2. import com.alibaba.fastjson.JSONArray;
  3. import com.alibaba.fastjson.JSONObject;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import java.util.regex.Matcher;
  7. import java.util.regex.Pattern;
  8. /**
  9. * @author Ryan
  10. * @version 1.0
  11. * @date 2021/9/9
  12. */
  13. public class JSONUtil {
  14. private Pattern pattern = Pattern.compile("\\[.\\]");
  15. private String str = "{\n" +
  16. " \"code\": \"200\", \n" +
  17. " \"total\": 1, \n" +
  18. " \"data\": [\n" +
  19. " {\n" +
  20. " \"people\":{\n" +
  21. " \t\"name\":\"SS\",\n" +
  22. " \"age\":10,\n" +
  23. " \"sex\":\"F\",\n" +
  24. " \"address\":{\n" +
  25. " \"country\":\"中国\",\n" +
  26. " \"city\":\"重庆市\",\n" +
  27. " \t \"street\":\"皇室桀骜\"\n" +
  28. " }\n" +
  29. " }\n" +
  30. " },{\n" +
  31. " \"people\":{\n" +
  32. " \t\"name\":\"SS\",\n" +
  33. " \"age\":10,\n" +
  34. " \"sex\":\"F\",\n" +
  35. " \"address\":{\n" +
  36. " \"country\":\"中国\",\n" +
  37. " \"city\":\"重庆市\",\n" +
  38. " \t \"street\":\"皇室桀骜\"\n" +
  39. " }\n" +
  40. " }\n" +
  41. " },{\n" +
  42. " \"people\":{\n" +
  43. " \t\"name\":\"SS\",\n" +
  44. " \"age\":10,\n" +
  45. " \"sex\":\"F\",\n" +
  46. " \"address\":{\n" +
  47. " \"country\":\"中国\",\n" +
  48. " \"city\":\"重庆市\",\n" +
  49. " \t \"street\":\"皇室桀骜\"\n" +
  50. " }\n" +
  51. " }\n" +
  52. " },{\n" +
  53. " \"people\":{\n" +
  54. " \t\"name\":\"SS\",\n" +
  55. " \"age\":10,\n" +
  56. " \"sex\":\"F\",\n" +
  57. " \"address\":{\n" +
  58. " \"country\":\"中国\",\n" +
  59. " \"city\":\"重庆市\",\n" +
  60. " \t \"street\":\"皇室桀骜\"\n" +
  61. " }\n" +
  62. " }\n" +
  63. " }\n" +
  64. " ]\n" +
  65. "}";
  66. public static void main(String[] args) {
  67. JSONUtil util = new JSONUtil();
  68. JSONObject obj = (JSONObject) JSONObject.parse(util.str);
  69. List<String> list = util.splitDataByPath(obj,"data[?].people.address",new ArrayList<>());
  70. for(String s:list){
  71. System.out.println(s);
  72. }
  73. }
  74. private List<String> splitDataByPath(JSONObject object, String path, List<String> list) {
  75. if(path == null||"".equals(path)){
  76. System.out.println("path 不能为空");
  77. }
  78. if(object == null){
  79. return list;
  80. }
  81. int poz = path.indexOf(".");
  82. if(poz!=-1){
  83. String p = path.substring(0,poz);
  84. String idx = regexPath(p);
  85. //继续封装,递归
  86. String nextPath = path.substring(poz+1);
  87. if(idx==null){
  88. splitDataByPath(object.getJSONObject(p),nextPath,list);
  89. }else{
  90. JSONArray array = object.getJSONArray(p.substring(0,p.length()-3));
  91. if("?".equals(idx)){
  92. //everyone should to do
  93. for(Object o:array){
  94. splitDataByPath((JSONObject)o,nextPath,list);
  95. }
  96. }else {
  97. //just get one
  98. int index = Integer.valueOf(idx);
  99. //防止下标越界
  100. if(index<array.size()){
  101. splitDataByPath((JSONObject) array.get(index),nextPath,list);
  102. }
  103. }
  104. }
  105. }else{
  106. String idx = regexPath(path);
  107. //取数据,封装返回
  108. if(idx==null){
  109. list.add(object.getString(path));
  110. }else{
  111. JSONArray array = object.getJSONArray(path.substring(0,path.length()-3));
  112. if("?".equals(idx)){
  113. //everyone should to do
  114. for(Object o:array){
  115. list.add(o.toString());
  116. }
  117. }else {
  118. //just get one
  119. int index = Integer.valueOf(idx);
  120. if(index<array.size()){
  121. list.add(array.getString(index));
  122. }
  123. }
  124. }
  125. }
  126. return list;
  127. }
  128. /**
  129. * 解析path,并判断是否为数组,及数组中的位置
  130. * @param path
  131. * @return
  132. */
  133. private String regexPath(String path){
  134. Matcher matcher = pattern.matcher(path);
  135. if(matcher.find()){
  136. String pos = matcher.group();
  137. return pos.substring(1,2);
  138. }
  139. return null;
  140. }
  141. }

这里使用了fastjson,也可以使用其他json替换。最终得到的结果如下:

  1. {"country":"中国","city":"重庆市","street":"皇室桀骜"}
  2. {"country":"中国","city":"重庆市","street":"皇室桀骜"}
  3. {"country":"中国","city":"重庆市","street":"皇室桀骜"}
  4. {"country":"中国","city":"重庆市","street":"皇室桀骜"}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/977806
推荐阅读
相关标签
  

闽ICP备14008679号