使用BeanShell断言判断请求返回的Json相应结果(不同json格式整理)

第一种json格式


{
	"code": 0,
	"msg": "success",
	"success": true,
	"data": [
		{
			"materialCode": "6902265111719",
			"materialName": "海天蒸鱼豉油450ml*12",
			"materialType": 1,
			"sixNineCode": "6902265111719",
			"expirationDate": 720,
			"packingSpecification": 12,
			"basicUnit": "BOX",
			"minSaleUnit": "BOT",
			"importFlag": 1,
			"transportFlag": 0,
			"sourceSystem": 10,
			"createrName": "MD自动转换物料",
			"updaterName": "loms",
			"pkId": "6902265111719",
			"mdMaterialCode": "6902265111719",
			"verifyStatus": 2,
			"creater": -2,
			"createTime": 1538984955619,
			"updater": -2,
			"updateTime": 1538984955619,
			"useStatus": 1
		},
		{
			"materialCode": "6902265113003",
			"materialName": "海天特辣黄豆酱230g*15",
			"materialType": 1,
			"sixNineCode": "6902265113003",
			"expirationDate": 720,
			"packingSpecification": 15,
			"basicUnit": "BOX",
			"minSaleUnit": "BOT",
			"importFlag": 1,
			"transportFlag": 0,
			"sourceSystem": 10,
			"createrName": "MD自动转换物料",
			"updaterName": "loms",
			"pkId": "6902265113003",
			"mdMaterialCode": "6902265113003",
			"verifyStatus": 2,
			"creater": -2,
			"createTime": 1538984956726,
			"updater": -2,
			"updateTime": 1538984956726,
			"useStatus": 1
		}
	],
	"EnumVal": {}
}
 ———————————————— 
版权声明:本文为CSDN博主「哈布哥」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/nitibu/article/details/83339858

这个时候如果想得到data里面的materialCode字段信息,该如何操作呢,可以参考以下代码:

import org.json.JSONObject;
import org.json.JSONArray;
 
String result = prev.getResponseDataAsString();
 
JSONObject response = new JSONObject(result);
JSONArray array = response.getJSONArray("data");
 
if (array.length() != 2) {
  Failure=true ;
  FailureMessage ="array size < 2";
  return;
}
 
int count = 0;
for (int i = 0; i < 2; i++) {
  JSONObject temp = array.getJSONObject(i);
  String pkId = temp.get("pkId").toString();
  if (pkId.equals("6902265111719")) {
  	
      if (!temp.get("materialCode").equals("6902265111719")) {
          Failure=true ;
          FailureMessage ="pkId: " + pkId + ", material code error, code = " + temp.get("materialCode");
          return;
      }
 
      if (!temp.get("materialName").equals("海天蒸鱼豉油450ml*12")) {
          Failure=true ;
          FailureMessage ="pkId: " + pkId + ", material name error, name = " + temp.get("materialName");
          return;
      }
      count++;
  }
 
  if (pkId.equals("6902265113003")) {
      if (!temp.get("materialCode").equals("6902265113003")) {
          Failure=true ;
          FailureMessage ="pkId: " + pkId + ", material code error, code = " + temp.get("materialCode");
          return;
      }
 
      if (!temp.get("materialName").equals("海天特辣黄豆酱230g*15")) {
          Failure=true ;
          FailureMessage ="pkId: " + pkId + ", material name error, name = " + temp.get("materialName");
          return;
      }
      count++;
  }
}
 
if (count != 2) {
  log.info("count != 2");
  Failure=true ;
  FailureMessage ="pkId not in range";
  return;
}
 
log.info(array.toString())

 ———————————————— 
版权声明:本文为CSDN博主「哈布哥」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/nitibu/article/details/83339858

主要思路:

  1. 先通过prev.getResponseDataAsString获取到响应的返回结果,然后通过org.json.JSONObject(解析json)和org.json.JSONArray(解析数组)来解析返回的响应的结果。
  2. 解析出想要的json对象后,在for循环中对Json对象中每一个需要检测的值和预期进行对比,如果不正确,Failure设置为true,FailureMessage设置具体的错误信息。
  3. for循环中有可能一开始的pkId取值就和期望不一致,所以这个时候需要计算下遍历的计数count,如果计数和期望的不一致,则说明响应结果和期望结果的数量不一致。

第二种json格式

{
    "responseCode":"1",
    "responseMessage":"success",
    "responseType":null,
    "data":{
        "city":"上海",
        "rentUnit":"月",
        "source":"个人房源网",
        "title":"徐盈路1188弄徐泾青浦徐泾租房",
        "belonger":"个人",
        "housingType":"住宅",
        "floor":"高层",
        "rentPrice":"17000",
        "titleLink":"http://sh.grfy.net/rent/d-34612565.html",
        "decoration":null,
        "direction":null,
        "isSplit":"否",
        "imgs":null,
        "publishTime":"2018-07-25T23:20:33.471",
        "contactMobile":null,
        "website":"http://sh.grfy.net/rent/list_2_0_0_0-0_0_0-0_0_2_0_{}_.html",
        "address":"徐泾",
        "contactName":"王女士",
        "houseType":"4室2厅2卫",
        "estate":"徐泾",
        "roomArea":"177",
        "collectHouseType":"住宅",
        "collectType":"出租",
        "district":"青浦",
        "totalFloor":"共20层",
        "region":"上海",
        "isRegister":"否",
        "desc":"仁恒西郊花园 4室2厅2卫 房屋亮点 新上 配套齐全 有阳台 首次出租 随时看房 出租要求 一家人 一年起租 租户稳定 作息正常 房源描述小区环境好,物业管理成熟,私人会所实施配套齐全,临近地铁17号徐盈站,周边多所国际学校,仁恒的房子品质有保障。无中介费。"
    }
}

代码如下:

import org.json.*;

//获取上一个请求的返回值
String response = prev.getResponseDataAsString();
//将返回值转换为json
JSONObject responseJson = new JSONObject(response);
//获取responseMessage
String message = responseJson.getString("responseMessage");
log.info("message的值:" + message);

if(!message.equals("success")){
    Failure = true; 
    FailureMessage = "规则解析失败,message不等于success";
    return;
}
//思路:在后面的其他接口中如何需要使用变量message和titleLink,可以使用${message}和${titleLink}来获取变量的值;

//变量储存好后,在需要断言的接口后面添加BeanShell断言,使用Failrue来标识断言失败,FailureMessage标示断言失败的原因,如:
//获取titleLink
Object titleLink = responseJson.getJSONObject("data").get("titleLink");
log.info("titleLink的值:" + titleLink.toString());


if(titleLink.toString().equals("null") || "".equals(titleLink)){
    Failure = true; 
    FailureMessage = "规则解析失败,titleLink为空";
}else if(!titleLink.toString().startsWith("http") && !titleLink.toString().startsWith("https")){
    Failure = true;
    FailureMessage = "规则解析失败,titleLink不为空,但是不是以http或者https开头的";
}
———————————————— 
版权声明:本文为博客「 lwjnicole 」的文章,转载请附上原文出处链接及本声明。
原文链接:https://www.cnblogs.com/lwjnicole/p/9383872.html

Json 节点 的解析总结

json节点解析相比使用gson解析比较复杂。其实gson能满足大多数应用场合。在一些特殊情况下,例如只需要把json的一部分节点解析成javabean则需要根据json节点进行解析。

如何使用json节点进行解析? 当根节点是”{}”使用JsonObject。当跟节点是”[]”使用jsonArray。 示例代码:

解析根节点为”[]”的json:

[
    {
        "id": 1580615,
        "name": "皮的嘛",
        "packageName": "com.renren.mobile.android",
        "iconUrl": "app/com.renren.mobile.android/icon.jpg",
        "stars": 2,
        "size": 21803987,
        "downloadUrl": "app/com.renren.mobile.android/com.renren.mobile.android.apk",
        "des": "2011-2017 你的铁头娃一直在这儿。中国最大的实名制SNS网络平台,嫩头青"
    },
    {
        "id": 1540629,
        "name": "不存在的",
        "packageName": "com.ct.client",
        "iconUrl": "app/com.ct.client/icon.jpg",
        "stars": 2,
        "size": 4794202,
        "downloadUrl": "app/com.ct.client/com.ct.client.apk",
        "des": "斗鱼271934走过路过不要错过,这里有最好的鸡儿"
    }
]

作者:小二阳
链接:https://juejin.im/post/5a31e4396fb9a044fd11c6a8
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解析的代码如下:

JSONArray jsonArray=new JSONArray(json);
            for(int i=0;i<jsonArray.length();i++){
                JSONObject object=jsonArray.getJSONObject(i);
                String id=object.getString("id");
                String name=object.getString("name");
                String packageName=object.getString("packageName");
                String iconUrl = object.getString("iconUrl");
                double stars=Double.parseDouble(object.getString("stars"));
                String size=object.getString("size");
                String downloadUrl = object.getString("downloadUrl");
                String des = object.getString("des");
               //其他操作
               ....
            }

作者:小二阳
链接:https://juejin.im/post/5a31e4396fb9a044fd11c6a8
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解析根节点为”{}”的json:

{
            "id": 1525490,
            "name": "有缘网",
            "packageName": "com.youyuan.yyhl",
            "iconUrl": "app/com.youyuan.yyhl/icon.jpg",
            "stars": 4,
            "size": 3876203,
            "downloadUrl": "app/com.youyuan.yyhl/com.youyuan.yyhl.apk",
            "des": "产品介绍:有缘是时下最受大众单身男女亲睐的婚恋交友软件。有缘网专注于通过轻松、"
        }

作者:小二阳
链接:https://juejin.im/post/5a31e4396fb9a044fd11c6a8
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 JSONObject object = new JSONObject(json);
            long id = object.getLong("id");
            String name = object.getString("name");
            String packageName = object.getString("packageName");
            String iconUrl = object.getString("iconUrl");
            float stars = Float.parseFloat(object.getString("stars"));
            long size = object.getLong("size");
            String downloadUrl = object.getString("downloadUrl");
            String des = object.getString("des");

作者:小二阳
链接:https://juejin.im/post/5a31e4396fb9a044fd11c6a8
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

现在有更加复杂格式的respone数据:

{  
  "priorityGroups": {  
    "proId": 1234,  
    "name": "项目一",  
    "groups": [  
      {  
        "id": "50356",  
        "items": [  
          {  
            "proId": 1360,  
            "n": "PC端",  
            "index": 1  
          },  
          {  
            "proId": 1361,  
            "n": "iOS端",  
            "index": 2  
          },  
          {  
            "proId": 1362,  
            "n": "安卓端",  
            "index": 4  
          }  
        ]  
      }  
    ]  
  },  
  "promotion": {  
    "proId": 1364,  
    "cusId": 84,  
    "name": "项目二",  
    "from": 1470821215,  
    "to": 1470907615,   
    "status": 1,  
    "objectId": 1069,  
    "createBy": 394,  
    "eff": 1470821215000,  
    "createTime": 1470821155000  
  }  
}  
 ———————————————— 
版权声明:本文为CSDN博主「sysu_lluozh」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lluozh2015/article/details/72834014

如果需要解析groups中的数据,需要怎么实现呢?

import org.json.JSONArray;  
import org.json.JSONException;  
import org.json.JSONObject;  

String jsonContent = prev.getResponseDataAsString();  

JSONObject response = new JSONObject(jsonContent);  
JSONArray groups = response.getJSONObject("priorityGroups").getJSONArray("groups");  
String strGroups = groups.toString(); 
 ———————————————— 
版权声明:本文为CSDN博主「sysu_lluozh」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lluozh2015/article/details/72834014

[
    {
        "properties":{
            "cal_name":"番木瓜",
            "e_type":"food",
            "end_index":6,
            "food_id":8520,
            "kcal_unit_weight":38.157,
            "name":"番木瓜",
            "start_index":3,
            "time_stamp":1566544101
        },
        "sub_properties":{
            "grams":200,
            "is_default":true,
            "quantifier_id":18,
            "quantity":1,
            "unit":"份"
        },
        "type":"Entity"
    },
    {
        "properties":{
            "cal_name":"木瓜",
            "e_type":"food",
            "end_index":2,
            "food_id":5801,
            "kcal_unit_weight":38.157,
            "name":"木瓜",
            "start_index":0,
            "time_stamp":1566544101
        },
        "sub_properties":{
            "grams":200,
            "is_default":true,
            "quantifier_id":18,
            "quantity":1,
            "unit":"份"
        },
        "type":"Entity"
    }
]

如图,响应结果的格式是[],根据上面的文档总结,我们可以总结一下思路:

  1. 首先使用prev.getResponseDataAsString()获取响应结果
  2. 使用JSONArray解析当前响应结果数据;
  3. 使用JSONObject得到json对象
  4. 使用JSONObject获取properties对象
  5. 使用getString取响应结果中properties中的calname
  6. 保存变量为jmeter变量,这样其他地方可以使用${}使用该变量了

具体部分代码如下

	String response_data = prev.getResponseDataAsString();//获取请求返回值,此处获取到String类型;
	//JSONObject data_obj = new JSONObject(response_data);//将string类型的返回值构建成JSONObject对象

	//JSONArray data_array = response_data.getJSONArray[0];//返回结果是数组
	JSONArray data_array = new JSONArray(response_data);
	//返回数组对象
	JSONObject object = data_array.getJSONObject(0);
	//只获取响应结果中第一个properites的信息,需要取得多个properties,则可以使用for循环
	JSONObject temp_properties = (JSONObject)object.getJSONObject("properties");
	//只获取响应结果中properties中的calname值
	cal_name_string = temp_properties.getString("cal_name");
	log.info("Beanshell 后置处理器的提取的响应cal_name响应结果是:"+ cal_name_string);
	//保存响应结果中的cal_name变量
	vars.put("cal_name_string",cal_name_string);
			
	name_string = temp_properties.getString("name");
	log.info("Beanshell 后置处理器的提取的响应name_string响应结果是:"+ name_string);
	//保存响应结果中的cal_name变量
	vars.put("name_string",name_string);

	

至此,目前遇到的json解析问题依然解决了🏴

posted @ 2019-08-23 15:38  janehost  阅读(1481)  评论(0编辑  收藏  举报