在 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 构造案例 类 的示例,用于访问和处理所需的字段;这是一个简化的工作 example 与 circe
:
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 字符串,您需要为其所有字段创建大小写 类,如评论部分所述。
我在 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 构造案例 类 的示例,用于访问和处理所需的字段;这是一个简化的工作 example 与 circe
:
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 字符串,您需要为其所有字段创建大小写 类,如评论部分所述。