前面几篇博文分别讲述了 JSON 的 概要知识、简单数据获取、封装cssSelector数据获取方法、JSONObject 是否包含 key_value,请自行阅读相关博文。
在日常的接口测试脚本编写过程中,经常需要依据有个特定的条件,获取条件匹配数据对应的其他属性的值。例如,在验证订单信息的接口测试脚本中,我们首先需要获取订单列表,然后通过订单编号找到对应的订单,再获取订单对应的支付金额、配送信息等数据;当然,也可直接获取订单信息,然后获取相应的数据。此文主要讲述第一种情况,当请求响应中含有多个相似的数据信息列表时,若何获取满足特定 key_value 的 JSONObject 并获取相应的 key 对应的 value。
直接上源码:
/** * Aaron.ffp Inc. * Copyright (c) 2004-2015 All Rights Reserved. */ package com.demo; import java.io.IOException; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.jsoup.Jsoup; import org.jsoup.helper.StringUtil; import org.jsoup.nodes.Document; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import org.testng.log4testng.Logger; /** * * @author Aaron.ffp * @version V1.0.0: Jsoup com.demo ITestHome.java, 2015-8-31 19:03:15 Exp $ */ public class ITestHome { private String request = "http://mb.51buy.com/json.php?mod=home&act=config"; private Logger logger = Logger.getLogger(this.getClass()); private String message = ""; private Document doc; private String test; /** * send request and get response * * @author Aaron.ffp * @version V1.0.0: Jsoup com.demo ITestHome.java beforeTest, 2015-8-31 19:04:05 Exp $ * * @throws IOException */ @BeforeTest public void beforeTest() throws IOException{ this.doc = Jsoup.connect(this.request).data("appSource","android") .userAgent("Jsoup demo") .cookie("user", "Jsoup") .timeout(5000).get(); this.test = doc.select("body").get(0).text(); } /** * * * @author Aaron.ffp * @version V1.0.0: Jsoup com.demo ITestHome.java test_getJSONObjectItemTextUseKV, 2015-9-3 21:31:45 Exp $ * */ @Test public void test_getJSONObjectItemTextUseKV(){ JSONObject jo = new JSONObject(this.getJsonText(this.test, "$data|#floor|$1|#colmunInfo|$0")); String key_value = "title:星星"; String key = "picUrl"; if (this.isJSONObjectContainKV(jo, key_value)) { this.message = key_value + " --> " + this.getJSONObjectItemTextUseKV(jo, key_value, key) + " "; System.out.println(this.message); } else { this.message = "{" + key_value + "} not macth the JSONObject " + jo.toString() + " "; System.out.println(this.message); } key_value = "title:范丰平 - 博客园"; if (this.isJSONObjectContainKV(jo, key_value)) { this.message = key_value + " --> " + this.getJSONObjectItemTextUseKV(jo, key_value, key) + " "; System.out.println(this.message); } else { this.message = "{" + key_value + "} not macth the JSONObject " + jo.toString() + " "; System.out.println(this.message); } key_value = "范丰平:博客园"; if (this.isJSONObjectContainKV(jo, key_value)) { this.message = key_value + " --> " + this.getJSONObjectItemTextUseKV(jo, key_value, key) + " "; System.out.println(this.message); } else { this.message = "{" + key_value + "} not macth the JSONObject " + jo.toString() + " "; System.out.println(this.message); } key_value = "title:相机九月发券"; if (this.isJSONObjectContainKV(jo, key_value)) { this.message = key_value + " --> " + this.getJSONObjectItemTextUseKV(jo, key_value, key) + " "; System.out.println(this.message); } else { this.message = "{" + key_value + "} not macth the JSONObject " + jo.toString() + " "; System.out.println(this.message); } } /** * Get the text from JSONObject which the key_value was included. * * @author Aaron.ffp * @version V1.0.0: Jsoup com.demo ITestHome.java getJSONObjectItemTextUseKV, 2015-9-3 20:24:31 Exp $ * * @param jsonObject : JSONObject * @param key_value : key and value * @param key : key * * @return String */ public String getJSONObjectItemTextUseKV(JSONObject jsonObject, String key_value, String key){ if (jsonObject == null) { return ""; } if (StringUtil.isBlank(key_value) || StringUtil.isBlank(key)) { this.message = "The argument {" + key_value + "} must be not null and empty, please check this!"; logger.error(this.message); new IllegalArgumentException(this.message); } if (!"2".equals(String.valueOf(key_value.split(":").length)) || StringUtil.isBlank(key_value.split(":")[0]) || StringUtil.isBlank(key_value.split(":")[1])) { this.message = "The argument {" + key_value + "} is invalid, please check this!"; logger.error(this.message); new IllegalArgumentException(this.message); } if (this.isJSONObjectContainKV(jsonObject, key_value)) { return jsonObject.get(key).toString(); } else { this.message = "Can't find the " + key_value + "in the JSONObject {" + jsonObject.toString() + "}. Please check this!"; this.logger.warn(this.message); System.out.println(this.message); return ""; } } /** * Assert the key-value exist or not in the JSONObject * * @author Aaron.ffp * @version V1.0.0: Jsoup com.demo ITestHome.java isJSONObjectContainKV, 2015-9-2 20:05:18 Exp $ * * @param jsonObject : JSONObject * @param kv : key:value * * @return boolean */ public boolean isJSONObjectContainKV(JSONObject jsonObject, String key_value){ boolean flag = false; String actValue = ""; String key = key_value.split(":")[0]; String expValue = key_value.split(":")[1]; try{ if (jsonObject == null) { throw new NullPointerException("The first argument {" + jsonObject + "} is null, please check this!"); } // assert key_value : null, empty, whitespace if (StringUtil.isBlank(key_value) || !"2".equals(String.valueOf(key_value.split(":").length)) || StringUtil.isBlank(key) || StringUtil.isBlank(expValue)) { this.message = "The second argument {" + key_value + "} is invalid, please check this!"; this.logger.warn(this.message); throw new IllegalArgumentException(this.message); } if (this.isJSONObjectContainKey(jsonObject, key)) { actValue = jsonObject.get(key).toString(); // assert the actual value is expected or not if (expValue.equals(actValue)) { flag = true; } } else { this.message = "The key {" + key + "} not exist, please check this."; this.logger.warn(this.message); } } catch (JSONException je){ this.message = je.getMessage(); this.logger.error(this.message); return flag; } return flag; } /** * Assert key is included in JSONObject or not. * * @author Aaron.ffp * @version V1.0.0: Jsoup com.demo ITestHome.java isJSONObjectContainKey, 2015-9-3 20:51:21 Exp $ * * @param jsonObject : JSONObject * @param key : key * * @return boolean */ public boolean isJSONObjectContainKey(JSONObject jsonObject, String key){ boolean flag = false; try { if (jsonObject == null) { throw new NullPointerException("The first argument {" + jsonObject + "} is null, please check this!"); } // assert key_value : null, empty, whitespace if (StringUtil.isBlank(key)) { this.message = "The second argument {" + key + "} is invalid, please check this!"; this.logger.warn(this.message); throw new IllegalArgumentException(this.message); } jsonObject.get(key); flag = true; } catch (Exception e) { this.message = e.getMessage(); this.logger.error(this.message); } return flag; } /** * Get JSON Object {JSONObject, JSONArray, text} by json selector * * @author Aaron.ffp * @version V1.0.0: Jsoup com.demo ITestHome.java getJsonText, 2015-9-1 19:40:12 Exp $ * * @param json : JSON string * @param selector : JSON selector * $key|$key|#array|#int|$int|key * #key|#int * $key|#key|$int * key * * array|key : is illegal * key|$ : is illegal * key|# : is illegal * key|key : is illegal * @return */ public String getJsonText(String json, String selector){ JSONObject jo = null; JSONArray ja = null; String jsonText = ""; String item = ""; String flag = "O"; // O - JSONObject; A - JSONArray; T - text // arguments must not be null if (json == null || selector == null) { this.message = "The argument {" + json + "} and {" + selector + "} must be not null, please check this!"; this.logger.error(this.message); new IllegalArgumentException(this.message); } // return empty if the json is empty if ("".equals(json)) { return ""; } // return json if the selector is empty if ("".equals(selector)) { return json; } try{ jo = new JSONObject(json); String[] select = selector.split("\|"); for (int i = 0; i < select.length; i++) { item = select[i]; // throw exception when selector against the rule if (flag.equals("T") || (flag.equals("A") && (!item.startsWith("O") || !item.startsWith("A") || !StringUtil.isNumeric(item.substring(1))))) { new IllegalArgumentException("The argument {" + selector + "} is invalid to the define rule of selector, please check this!"); } if (item.startsWith("#")) { // get JSONArray if (flag.equals("A")) { ja = ja.getJSONArray(Integer.valueOf(item.substring(1))); } else if (flag.equals("O")){ ja = jo.getJSONArray(item.substring(1)); } flag = "A"; } else if (item.startsWith("$")){ // get JSONObject if (flag.equals("O")) { jo = jo.getJSONObject(item.substring(1)); } else if (flag.equals("A")){ jo = ja.getJSONObject(Integer.valueOf(item.substring(1))); } flag = "O"; } else { // get text jsonText = jo.get(item).toString(); flag = "T"; } } } catch (JSONException jsone){ jsone.printStackTrace(); } switch (flag) { case "O": return jo.toString(); case "A": return ja.toString(); default: return jsonText; } } }
执行结果如下图所示:
至此, Java学习-031-JSON 之五 -- 特定数据获取(JSONObject满足特定键值) 顺利完结,希望此文能够给初学 JSON 的您一份参考。
最后,非常感谢亲的驻足,希望此文能对亲有所帮助。热烈欢迎亲一起探讨,共同进步。非常感谢! ^_^