• JsonPath如何获取JSON数据中的值


    场景: 发送接口请求后,得到请求结果值是Json数据, 需要从Json数据信息中提取字段值。

              响应值字符与字符之间有空格,导致用正则表达式方法提取比较麻烦,于是用java的JsonPath方法提取快速方便好用,根据JSON路径去取。

    Json数据: 需要提取FILE 字段对应的值。

    {
       "data" : {
          "testCaseData" : [
             {
                "agent_version" : "9.7.0.2225",
                "android_id" : "e3d699cf01620531",
                "asset_number" : "",
                "FILE" : "./ wwwccko(33)  .zip",
                "noncomp_reason" : "",
             },
             {
                "agent_version" : "2.0.0.1518",
                "android_id" : "",
                "asset_number" : "",
                 "FILE" : "./XXXX(22)  .zip",
                "noncomp_reason" : "",
             }
          ],
          "total_count" : 2
       },
       "error_code" : 1,
       "message" : "Success",
       "timestamp" : 1504765848
    }

    解决方法:

    package com.app.test;
    
    import java.util.LinkedHashMap;
    import net.minidev.json.JSONArray;
    import com.jayway.jsonpath.JsonPath;
    import com.jayway.jsonpath.Predicate;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    
    public class TestJsonPath {
    
        public static void main(String[] args) {
            String charset = "utf-8";
            File file = new File("D:\Work_Report\JSON2.txt");
            long fileByteLength = file.length();
            byte[] content = new byte[(int) fileByteLength];
            FileInputStream fileInputStream = null;
            try {
                fileInputStream = new FileInputStream(file);
                fileInputStream.read(content);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            String str = null;
            try {
                str = new String(content, charset);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            System.out.println(str);
            readjson(str, "$.data.testCaseData[0].FILE");
            System.out.println(readjson(str, "$.data.testCaseData[0].FILE"));
        }
    
        public static String readjson(String json, String jsonPath) {
            try {
                Object value = JsonPath.read(json, jsonPath, new Predicate[0]);
                if (value instanceof Integer) {
                    return value.toString();
                } else if (value instanceof String) {
                    return value.toString();
                } else if (value instanceof Boolean) {
                    return value.toString();
                } else if (value instanceof JSONArray) {
                    JSONArray arr = (JSONArray) value;
                    if (!arr.isEmpty()) {
                        return arr.toJSONString();
                    } else
                        return "";
                } else if (value instanceof LinkedHashMap) {
                    return value.toString();
                } else if (value instanceof Float) {
                    return value.toString();
                } else {
                    return value.toString();
                }
            } catch (Exception e) {
                return "pathnotfound";
            }
        }
    }

    注: JsonPath固定语法:   $.XX.XX[索引].对象key

    依赖包

    <dependency>
        <groupId>com.jayway.jsonpath</groupId>
        <artifactId>json-path</artifactId>
        <version>2.4.0</version>
    </dependency>
    String rep.jsonpath.result;
    rep=repv.getResponseDataAsString();
    jsonpath = "$.data.device[1].version
    result = readjson(pre,jsonpath)
    vars.put("XX",result)

    工具类:

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.LinkedHashMap;
    import net.minidev.json.JSONArray;
    import com.jayway.jsonpath.JsonPath;
    import com.jayway.jsonpath.Predicate;
    
    public class Utils {
    
        public static String readJson(String filePath) {
            String charset = "utf-8";
            File file = new File(filePath);
            long fileByteLength = file.length();
            byte[] content = new byte[(int) fileByteLength];
            FileInputStream fileInputStream = null;
            try {
                fileInputStream = new FileInputStream(file);
                fileInputStream.read(content);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            String str = null;
            try {
                str = new String(content, charset);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            return str;
        }
    
        public static String readjson(String json, String jsonPath) {
            try {
                Object value = JsonPath.read(json, jsonPath, new Predicate[0]);
                if (value instanceof Integer) {
                    return value.toString();
                } else if (value instanceof String) {
                    return value.toString();
                } else if (value instanceof Boolean) {
                    return value.toString();
                } else if (value instanceof JSONArray) {
                    JSONArray arr = (JSONArray) value;
                    if (!arr.isEmpty()) {
                        return arr.toJSONString();
                    } else
                        return "";
                } else if (value instanceof LinkedHashMap) {
                    return value.toString();
                } else if (value instanceof Float) {
                    return value.toString();
                } else {
                    return value.toString();
                }
            } catch (Exception e) {
                return "pathnotfound";
            }
        }
    
    }
  • 相关阅读:
    波松分酒问题 C++求最优解. Anthony
    Effective STL 条款7 Anthony
    Effective STL 条款16 Anthony
    数据库设计经验之谈[转载]
    C#递归在dropdownlist显示树状
    多域名同主机js转向
    ASP.NET中常用的26个优化性能方法
    域名解析、子域名、cname别名指向、MX记录、泛域名与泛解析、域名绑定、域名转向
    C#数据库递归构造treeview树形结构
    ASP.NET多种方式生成高质量缩略图
  • 原文地址:https://www.cnblogs.com/Shanghai-vame/p/10098833.html
Copyright © 2020-2023  润新知