如何在Jmeter中将Json转换为Java对象

4
我们的需求是需要将Json响应转换为Java对象。请问在Jmeter中如何实现?我们可以使用Beanshell吗?
以下是示例响应:
{"items":[],"indicators":
[{"name":"location","type":"country","title":"Country"},{"name":"total","type":"number","title":"Entities Total"}]

我们可以将数据存储为Csv或json格式,但如何将其转换为Java对象呢? 能有人帮我们吗?

这是你要找的吗?http://www.jsonschema2pojo.org/ - utkusonmez
这很不错,但它只有基本类,需要更多的数据。 - Kavinkumar Muthu
3个回答

1
您可以使用BeanShell处理此JSON。 您可以使用作为JMeter 3.3的一部分提供的json-smart(我不知道以前的版本)。 这里有一个示例代码,用于处理您的JSON并从数组“indicators”的第一个元素中获取“type”。
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缺少一个最后的 '}'。


0

0
使用JMeter自带的JSON smart库。有关示例代码,请参考以下答案或上一个答案中给出的代码。
然后,您可以使用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\":\"Buddhika75@mspblank.com\",\"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>

我在您的帖子中使用了提到的代码并进行了修改,但是我遇到了以下错误:-'jmeter.extractor.BeanShellPostProcessor: BeanShell脚本中出现问题org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval In file: inline evaluation of: ``import org.apache.commons.lang3.StringUtils; import net.minidev.json.parser.JSON . . . '' Encountered "items" at line 6, column 27.' - Kavinkumar Muthu
在原来的答案中添加了JMeter测试计划和输出结果。为了使上述代码工作,您需要在JMeter\lib目录中拥有以下jar包:commons-lang3-3.4.jar和json-smart-2.2.jar(任何版本)。默认情况下,它随您的Jmeter安装一起提供。如果您仍然遇到错误,请确保您的代码正确。即使是一个简单的语法问题也可能导致上述错误。 - Selva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接