在 Scala/Gatling 中提取 json 响应的第 n 个元素

Extracting the n´th element of a json response in Scala/Gatling

我在 json 中有一个响应主体,我想在其中提取值:ID_ADFA0741-6A46-4A90-8AAE-BC7DB18B27E1

在下面的 json 结构中。

.check(jsonPath("$..key").saveAs("key")))

给我值 M01A

我如何使用检查来获取元素编号 2 的值“key”(下面“key”的第二次出现?

{"libItems":[{"hasNotes":false,"drugs":[{"ingredientNamesAndStrengths":[{"ingredientNames":["Diklofenak"],"strengths":["50 mg"]}],"order":0,"form":"Enterotab"}],"treatmentType":"Brand","isSupplement":false,"nameOfBrand":"Voltaren","nameFormStrength":"Diklofenak Enterotab 50 mg","medicationUsedFor":{"value":"TEST"},"clinicalWarnings":[],"dataWarnings":[{"practitionerName":"ELENA FOS ENGELUND","importDate":"2021-08-16T18:13:06.597+02:00","isNewTreatment":true,"type":"Import","isMarkedAsHandled":false}],"warningReferences":[{"key":"M01A","drugName":"Diklofenak Enterotab 50 mg","refType":"Atc"},{"key":"ID_ADFA0741-6A46-4A90-8AAE-BC7DB18B27E1","drugName":"Diklofenak Enterotab 50 mg","refType":"Atc"},{"key":"ID_BD1BDC3F-1FCF-4944-99BC-6B3E8EAAD6FD","drugName":"Diklofenak Enterotab 50 mg","refType":"Atc"}],"usage":"Fixed","atc":"M01AB05","atcNames":"Diklofenak","shortDose":{"key":"160","value":"1x3"},"drugId":"ID_BD1BDC3F-1FCF-4944-99BC-6B3E8EAAD6FD","hasIngredientNames":true,"prescriptionActions":["Stop","ConfirmUse","Renew","Prescribe"],"id":"440a01f5-1df8-4f26-a6c1-08d95cab00c7","treatmentId":"00be4297-cc9f-432d-30d6-08d95cab00c7","treatmentStart":"2021-06-02T00:00:00","dssnText":"1 tablett 3 ganger daglig","actionStatus":"ActionRequired","treatmentStatus":"Active","externalUpdate":"New","approvalStatus":"Empty","resepts":[{"localReseptState":"None","rfReseptState":"AvailableForDispatch"}],"diffPreviousValues":[],"hasRfError":false,"isLocked":false,"guardianAccessReservation":false,"paperReseptDispensation":false,"reseptPidState":"NoChange"}],"fibItems":[],"nibItems":[],"vaccines":[],"vibInformation":{"vibStatus":"ActionRequired","messagesToSign":{"new":0,"renewed":0,"changed":0,"stopped":0,"removed":0,"recalled":0,"registration":0,"stoppedLocalRegistration":0},"actionRequired":{"treatments":1,"nutritions":0,"consumables":0,"vaccines":0,"allergies":0,"warnings":0},"previousLibItems":["ID_BD1BDC3F-1FCF-4944-99BC-6B3E8EAAD6FD"]}}

好的,有两种方法。

第一个 - 您可以 'directly' 定义您需要提取的元素:

.check(jsonPath("$.[1].key").saveAs("key")))

第二种方式——您可以保存所有元素,然后通过 Gatling EL 使用所需的元素:

.check(jsonPath("$..key").findAll.saveAs("keys")))

"${keys(1)}"

因为在评论中,OP 请求了一个使用 Json parsing/serialization 库从提供的 Json 构造案例 类 的示例,用于访问和处理所需的字段;这是一个简化的工作 examplecirce:

import io.circe._, io.circe.generic.auto._, io.circe.syntax._,  io.circe.parser._

val myShortJsonString = 

"""{"libItems":
      [
          {
            "hasNotes":false,
            "warningReferences":[
                {"key":"M01A", "drugName":"Diklofenak Enterotab 50 mg", "refType":"Atc" },
                
                { "key":"ID_ADFA0741-6A46-4A90-8AAE-BC7DB18B27E1", "drugName":"Diklofenak Enterotab 50 mg", "refType":"Atc" },
                
                { "key": "ID_BD1BDC3F-1FCF-4944-99BC-6B3E8EAAD6FD", "drugName":"Diklofenak Enterotab 50 mg", "refType":"Atc" }
              ]
            
          }
      ]
   
    }"""

val myFullJsonString = 

"""{"libItems":
      [
          {
            "hasNotes":false,
            "drugs":[
                 {"ingredientNamesAndStrengths":[{"ingredientNames":["Diklofenak"],"strengths":["50 mg"]}],
                  "order":0,
                  "form":"Enterotab"}
                  ],
            "treatmentType":"Brand",
            "isSupplement":false,
            "nameOfBrand":"Voltaren",
            "nameFormStrength":"Diklofenak Enterotab 50 mg",
            "medicationUsedFor":{"value":"TEST"},
            "clinicalWarnings":[],
            "dataWarnings":[{"practitionerName":"ELENA FOS ENGELUND","importDate":"2021-08-16T18:13:06.597+02:00","isNewTreatment":true,"type":"Import","isMarkedAsHandled":false}],
            "warningReferences":[
              {"key":"M01A","drugName":"Diklofenak Enterotab 50 mg","refType":"Atc"},
              {"key":"ID_ADFA0741-6A46-4A90-8AAE-BC7DB18B27E1","drugName":"Diklofenak Enterotab 50 mg","refType":"Atc"},
              {"key":"ID_BD1BDC3F-1FCF-4944-99BC-6B3E8EAAD6FD","drugName":"Diklofenak Enterotab 50 mg","refType":"Atc"}],
            "usage":"Fixed",
            "atc":"M01AB05",
            "atcNames":"Diklofenak",
            "shortDose":{"key":"160","value":"1x3"},
            "drugId":"ID_BD1BDC3F-1FCF-4944-99BC-6B3E8EAAD6FD",
            "hasIngredientNames":true,
            "prescriptionActions":["Stop","ConfirmUse","Renew","Prescribe"],
            "id":"440a01f5-1df8-4f26-a6c1-08d95cab00c7",
            "treatmentId":"00be4297-cc9f-432d-30d6-08d95cab00c7",
            "treatmentStart":"2021-06-02T00:00:00",
            "dssnText":"1 tablett 3 ganger daglig",
            "actionStatus":"ActionRequired",
            "treatmentStatus":"Active",
            "externalUpdate":"New",
            "approvalStatus":"Empty",
            "resepts":[{"localReseptState":"None","rfReseptState":"AvailableForDispatch"}],
            "diffPreviousValues":[],
            "hasRfError":false,
            "isLocked":false,
            "guardianAccessReservation":false,
            "paperReseptDispensation":false,
            "reseptPidState":"NoChange"
          }
      ],
    "fibItems":[],
    "nibItems":[],
    "vaccines":[],
    "vibInformation":{
                            "vibStatus":"ActionRequired",
                            "messagesToSign":{
                                           "new":0,
                                           "renewed":0,
                                           "changed":0,
                                           "stopped":0,
                                           "removed":0,
                                           "recalled":0,
                                           "registration":0,
                                           "stoppedLocalRegistration":0
                                           },
                            "actionRequired":{
                                           "treatments":1,
                                            "nutritions":0,
                                            "consumables":0,
                                            "vaccines":0,
                                            "allergies":0,
                                            "warnings":0
                                            },
                            "previousLibItems":["ID_BD1BDC3F-1FCF-4944-99BC-6B3E8EAAD6FD"]
                      }
    }"""

case class Library(libItems: List[LibItem],
                   // fibItems: List[FibItem], nibItems: List[NibItem], vaccines: List[Vaccine], vibInformation: VibInformation
                  )

case class LibItem(hasNotes: Boolean, 
                   //drugs: List[Drug],
                   warningReferences: List[WarningReference])

case class WarningReference(key: String, drugName: String, refType: String)

val maybeLibraryJsonObject = parse(myShortJsonString)
val maybeLibrary = maybeLibraryJsonObject match {
  case Right(libraryJsonObject) =>  libraryJsonObject.as[Library] 
  case Left(failure) => println(failure)
}

maybeLibrary match {
  case Right(libraryResult) => 
     println(libraryResult)
     val libItems = libraryResult.asInstanceOf[Library].libItems
     val libItem = libItems(0)
     val warningReferenceKey = libItem.warningReferences(1).key 

     val warningReferenceKeySections = warningReferenceKey.split("-")

      val  code = warningReferenceKeySections(3)+"-"+warningReferenceKeySections(4)

   println("code: " + code) 

  case Left(failure) => println(failure)
}

要使其适用于完整的 json 字符串,您需要为其所有字段创建大小写 类,如评论部分所述。