2017-03-22 47 views
0

我们的需求是我们需要将Json响应转换为Java对象。我可以知道如何在Jmeter?我们可以使用Beanshell吗?如何将Json转换为Jmeter中的Java对象

这里是我的样本响应

{"items":[],"indicators": 
[{"name":"location","type":"country","title":"Country"},{"name":"total","type":"number","title":"Entities Total"}] 

我们能够保存到CSV或JSON格式,但如何将其转换成Java对象? 有没有可以帮助我们呢?

+0

这是你在找什么? http://www.jsonschema2pojo.org/ – utkusonmez

+0

这很好,但它只有基本的类,它需要更多的数据。 –

回答

0

使用JMeter附带的JSON智能库。有关示例代码,请参阅以下答案或上一个答案给出的答案。

然后,您可以使用vars.putObject和vars.getObject存储和检索对象,并在采样器之间传递它们。

https://stackoverflow.com/a/42859821/7332423

enter image description here

JMeter测试计划test.jmx

<?xml version="1.0" encoding="UTF-8"?> 
<jmeterTestPlan version="1.2" properties="2.9" jmeter="3.0 r1743807"> 
    <hashTree> 
    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true"> 
     <stringProp name="TestPlan.comments"></stringProp> 
     <boolProp name="TestPlan.functional_mode">false</boolProp> 
     <boolProp name="TestPlan.serialize_threadgroups">false</boolProp> 
     <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> 
     <collectionProp name="Arguments.arguments"/> 
     </elementProp> 
     <stringProp name="TestPlan.user_define_classpath"></stringProp> 
    </TestPlan> 
    <hashTree> 
     <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true"> 
     <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> 
     <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> 
      <boolProp name="LoopController.continue_forever">false</boolProp> 
      <stringProp name="LoopController.loops">1</stringProp> 
     </elementProp> 
     <stringProp name="ThreadGroup.num_threads">1</stringProp> 
     <stringProp name="ThreadGroup.ramp_time">1</stringProp> 
     <longProp name="ThreadGroup.start_time">1490275382000</longProp> 
     <longProp name="ThreadGroup.end_time">1490275382000</longProp> 
     <boolProp name="ThreadGroup.scheduler">false</boolProp> 
     <stringProp name="ThreadGroup.duration"></stringProp> 
     <stringProp name="ThreadGroup.delay"></stringProp> 
     </ThreadGroup> 
     <hashTree> 
     <DebugSampler guiclass="TestBeanGUI" testclass="DebugSampler" testname="Debug Sampler" enabled="true"> 
      <boolProp name="displayJMeterProperties">false</boolProp> 
      <boolProp name="displayJMeterVariables">true</boolProp> 
      <boolProp name="displaySystemProperties">false</boolProp> 
     </DebugSampler> 
     <hashTree> 
      <BeanShellPreProcessor guiclass="TestBeanGUI" testclass="BeanShellPreProcessor" testname="BeanShell PreProcessor" enabled="true"> 
      <stringProp name="filename"></stringProp> 
      <stringProp name="parameters"></stringProp> 
      <boolProp name="resetInterpreter">false</boolProp> 
      <stringProp name="script">import org.apache.commons.lang3.StringUtils; 
import net.minidev.json.parser.JSONParser; 
import net.minidev.json.JSONObject; 
import net.minidev.json.JSONArray; 

String sInputString = "return {\"items\":[{\"STANDARDRATEFORMAT\":\"0.00\",\"ASSIGNED_HRS\":0,\"RESOURCE_NAME\":\"#Buddhika \",\"COST\":\"0.00\",\"PERCENTASSIGNED\":\"100.00\",\"EMAIL\":\"[email protected]\",\"AVAILABLEFROM\":\"10-May-2011\",\"ALLOCATED_HRS\":\"1872.00\",\"RESOURCE_ID\":36197221,\"AVAILABLETO\":\"31-Mar-2012\",\"calendar\":{\"exceptions\":{},\"weekDayHours\":{}}}]}"; 

//String sInputString = prev.getResponseDataAsString(); 

try { 
    // Use StringUtils to cut the string between the two 
    String sCutString = StringUtils.substringBetween(sInputString, "return {\"items", "]}"); 
    String sFinalString = "{\"items" + sCutString + "]}"; 
    log.info("sFinalString=" + sFinalString); 

    // Use JSONParser to parse the JSON 
    JSONParser parser = new JSONParser(JSONParser.ACCEPT_NON_QUOTE|JSONParser.ACCEPT_SIMPLE_QUOTE); 
    JSONObject rootObject = (JSONObject) parser.parse(sFinalString); 
    //JSONObject rootObject = (JSONObject) parser.parse(prev.getResponseDataAsString()); 

    JSONArray jResourceArray = (JSONArray) rootObject.get("items"); 

    for (int i=0; i &lt; jResourceArray.size(); i++) { 
     log.info(jResourceArray.get(i).toString()); 
     // You can access individual elements using this 
     log.info("RESOURCE_ID=" + jResourceArray.get(i).get("RESOURCE_ID")); 
    } 


} 
catch (Exception ex) { 
    log.info("Exception.." + ex); 
}</stringProp> 
      </BeanShellPreProcessor> 
      <hashTree/> 
     </hashTree> 
     </hashTree> 
    </hashTree> 
    </hashTree> 
</jmeterTestPlan> 
+0

我以前提到的代码在您的文章,我修改,但我得到下面的错误: - 'jmeter.extractor.BeanShellPostProcessor:问题在BeanShell的脚本org.apache.jorphan.util.JMeterException:错误调用BSH方法: eval \t在文件中:inline评估:'import org.apache.commons.lang3.StringUtils;导入net.minidev.json.parser.JSON。 。 。 '在第6行第27列遇到“项目”。 –

+0

添加了JMeter测试计划并将输出添加到原始答案中。要使上述代码正常工作,您需要在JMeter \ lib目录中包含以下jar包。 commons-lang3-3.4.jar&json-smart-2.2.jar(任何版本)。默认情况下,它与Jmeter安装一起提供。如果您仍然收到错误,请确保您的代码是正确的。即使是简单的语法问题,您也可以获得上述错误 – Selva

0

可以使用BeanShell的处理这个JSON。您可以使用作为JMeter 3.3的一部分的json-smart(我不知道以前的版本)。在这里,你有例子代码来处理你的JSON和数组的第1个要素获得“类型”,“指标”:

import net.minidev.json.parser.JSONParser; 
import net.minidev.json.JSONObject; 
import net.minidev.json.JSONArray; 

JSONParser p = new JSONParser(JSONParser.MODE_PERMISSIVE); 

String jsonString = prev.getResponseDataAsString(); 
JSONObject jsonObj = (JSONObject) p.parse(jsonString); 
JSONArray arr = (JSONArray) jsonObj.get("indicators"); 

JSONObject indicator = (JSONObject) arr.get(0); 
String typeString = (String) indicator.get("type"); 

log.info("TYPE:" + typeString); 

vars.put("TYPEVAR", typeString); 

顺便说一句,你写的JSON缺少最后的“}”。