簡體   English   中英

從JSON提取元素的值

[英]Extracting the value of an element from a JSON

我正在嘗試進行測試,以便根據它們所屬的批次的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中提到的值。 有沒有辦法做到這一點? 謝謝。

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"));
         }

你可以做這樣的事情,有時候我會幫我解決的。

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
}

不確定語法,為您提供提示。

您可以檢查json對象中是否存在任何鍵或如下所示:

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

has方法用於查找jsonobject是否存在任何鍵。

我認為,一種更好的方法是從此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"));
  }

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

如果要為JSON驗證創建測試,則可以使用JSONAssert。

JSONAsset給出了assertEquals方法,該方法比較兩個json結構(是否嚴格相同)。

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

最后一個布爾參數定義您是否要進行嚴格的比較,或者只是比較一下,如果您的預期結果是響應產生的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM