【问题标题】:Extracting the value of an element from a JSON从 JSON 中提取元素的值
【发布时间】:2017-04-28 20:27:46
【问题描述】:

我正在尝试进行测试,根据它们所属的批次的 id 获取一些文档。更具体地说,我想检查响应正文中是否有特定的 batchPublicId。我正在使用 okhttp 进行测试。 这是 json 的较短版本:

{
  "_embedded": {
    "invoices": [
      {
        "type": "INVOICE",
        "publicId": "27bc8426-17cf-4fe5-9278-64108ae05e4b",
        "deliveryStatus": null,
        "processingStatus": "INITIATED",
        "batchPublicId": "0000000000000000000000001"
      }
     ]
   }
}

我是 json 新手,这就是我解决问题的程度:

String invoicesJsonData = response.body().string();
JSONObject invoicesJsonObject = new JSONObject(invoicesJsonData);

Assert.assertTrue(invoicesJsonObject.getJSONObject("_embedded") !=null && invoicesJsonObject.getJSONObject("_embedded").has("invoices"));

我想验证 batchPublicId 是否具有 json 中提到的值。有没有办法做到这一点?谢谢。

【问题讨论】:

  • 试试下面我的回答。
  • 查看我的更新答案。

标签: java json getjson


【解决方案1】:
String invoicesJsonData = response.body().string();
JSONObject invoicesJsonObject = new JSONObject(invoicesJsonData);
JSONObject invoicesJsonObject1 = invoicesJsonObject.getJSONObject("_embedded");
JSONArray f2=invoicesJsonObject1.getJSONArray("invoices");
 for(int i=0;i<f2.length();i++){

          JSONObject obj=f2.getJSONObject(i);
         if(obj.get("batchPublicId")!=null){
             System.out.println(obj.get("batchPublicId"));
         }

【讨论】:

  • @H.Avram 但上述解决方案不是找到密钥的标准。
【解决方案2】:

你可以做这样的事情,这有时对我有用。

String invoicesJsonData = response.body().string();
JSONObject invoicesJsonObject = new JSONObject(invoicesJsonData);       

JSONObject invoicesJsonObject = json.getJSONObject("invoicesJsonObject");
String batchPublicId = invoicesJsonObject.getString("batchPublicId");
System.out.println( "batchPublicId: " + batchPublicId );
if(batchPublicId !=null){
// do something
}

不确定语法。给你一个提示。

【讨论】:

    【解决方案3】:

    您可以检查json 对象中是否存在任何键,如下所示:

      if(jsonObject1.has("batchPublicId")){
      String batchPublicId = jsonObject1.optString("batchPublicId");
      Log.i(getClass().getSimpleName(), "batchPublicId=" + batchPublicId);}
    

    has 方法用于查找jsonobject 中是否存在任何键。

    【讨论】:

      【解决方案4】:

      在我看来,更好的方法是从这个 JSON 字符串创建一个 POJO,并使用简单的 getter 提取您需要的信息

      例如:

      包装类:

      @JsonIgnoreProperties(ignoreUnknown = true)
      @JsonRootName(value = "_embedded")
      public class Embeded {
      
        @JsonProperty("invoices")
        private List<Invoice> invoices;
      
        public Embeded() {}
      
        public List<Invoice> getInvoices() {
          return invoices;
        }
      
        public void setInvoices(List<Invoice> invoices) {
          this.invoices = invoices;
        }
      }
      

      发票类:

      @JsonIgnoreProperties(ignoreUnknown = true)
      public class Invoice {
      
        @JsonProperty("type")
        private String type;
        @JsonProperty("publicId")
        private String publicId;
        @JsonProperty("deliveryStatus")
        private String deliveryStatus;
        @JsonProperty("processingStatus")
        private String processingStatus;
        @JsonProperty("batchPublicId")
        private String batchPublicId; 
      
        public Invoice() {}
      
        public String getType() {
          return type;
        }
      
        public void setType(String type) {
          this.type = type;
        }
      
        public String getPublicId() {
          return publicId;
        }
      
        public void setPublicId(String publicId) {
          this.publicId = publicId;
        }
      
        public String getDeliveryStatus() {
          return deliveryStatus;
        }
      
        public void setDeliveryStatus(String deliveryStatus) {
          this.deliveryStatus = deliveryStatus;
        }
      
        public String getProcessingStatus() {
          return processingStatus;
        }
      
        public void setProcessingStatus(String processingStatus) {
          this.processingStatus = processingStatus;
        }
      
        public String getBatchPublicId() {
          return batchPublicId;
        }
      
        public void setBatchPublicId(String batchPublicId) {
          this.batchPublicId = batchPublicId;
        }
      }
      

      测试:

        public void json_test() throws JsonParseException, JsonMappingException, IOException {
          String json = "{"
                  +  "\"_embedded\": {"
                  +    "\"invoices\": ["
                  +    "{"
                  +    "\"type\": \"INVOICE\","
                  +   "\"publicId\": \"27bc8426-17cf-4fe5-9278-64108ae05e4b\","
                  +  "\"deliveryStatus\": null,"
                  +  "\"processingStatus\": \"INITIATED\","
                  +  "\"batchPublicId\": \"0000000000000000000000001\""
                  +   "}"
                  +  "]"
                  + "}"
                  + "}";
      
          ObjectMapper mapper = new ObjectMapper();
          mapper.configure(Feature.UNWRAP_ROOT_VALUE, true);
          List<Invoice> invoices = mapper.readValue(json, Embeded.class).getInvoices();
          Assert.assertTrue(StringUtils.equals(invoices.get(0).getBatchPublicId(), "0000000000000000000000001"));
        }
      

      【讨论】:

      • 这个解决方案的一部分很有帮助,但我测试端点,所以我不会真的在测试中使用字符串 json。
      【解决方案5】:

      如果我理解您的权利,您只需致电: Assert.assertTrue(invoicesJsonObject.getString("batchPublicId").equals("0000000000000000000000001"));"

      【讨论】:

        【解决方案6】:

        如果要为 JSON 验证创建测试,可以使用 JSONAssert。

        JSONAsset 给出方法 assertEquals,比较两个 json 结构,严格相同与否。

        final String expected_result = YOUR_EXPECTED_RESULT;
        JSONAssert.assertEquals(YOUR_EXPECTED_JSON_RESULT, RESULT_FROM_RESPONSE_BODY, false);
        

        最后一个布尔参数定义您是否需要严格比较,或者仅比较您的预期结果是否为响应结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多