Groovy получить объект в объекте json slurper со строкой

Я пытаюсь создать функцию, в которой я передаю объект json из JsonSlurper и строку, содержащую объект json, расположенный в оригинале. Если это так, он возвращает true или false, если условие количества элементов выполнено. Например:

мой Json:

{
  "Errors": [],
  "Loans": [
    {
      "Applications": [
        {
          "id": 1,
          "name": "test"
        }
      ]
    },
    {
      "Applications": [
        {
          "id": 2,
          "name": "test3"
        },
        {
          "id": 3,
          "name": "test3"
        }
      ]
    }
  ]
}

Мой метод получит массив json следующим образом:

def myJson = new JsonSlurper().parseText(receivedResponse.responseBodyContent)
def result = verifyElementsCountGreaterThanEqualTo(myJson, "Loans[0].Applications[1]", 3)

Есть ли такая библиотека, которая может сделать это для меня?

Я пробовал myJson["Loans[0].Applications[1]"] получить объект Json, чтобы получить размер, но результат null.


person usr4896260    schedule 28.08.2018    source источник
comment
не работает для меня.   -  person usr4896260    schedule 28.08.2018
comment
Затем, пожалуйста, добавьте к вопросу то, что вы уже пробовали, а также ошибки, которые вы получаете.   -  person cfrick    schedule 28.08.2018
comment
Что вам дает println(myJson.inspect())?   -  person cfrick    schedule 28.08.2018
comment
@cfrick, что бы вы порекомендовали в таком случае, как myMethod(myJson, "Loans.Applications[1]");? Это не работает, когда я пытаюсь это сделать. Я получаю null.   -  person usr4896260    schedule 29.08.2018
comment
@ usr4896260, пожалуйста, проверьте ответ ниже, чтобы узнать, поможет ли это.   -  person Rao    schedule 29.08.2018


Ответы (3)


Как насчет следующего? И это банально, я думаю.

Loans — это список, в котором вы получаете несколько Applications. Просто передайте индекс приложений.

def json = new groovy.json.JsonSlurper().parseText(jsonString)
//Closure to get the particular Loan
def getLoanAt = { json.Loans[it]}
//Call above closure as method to print the 2nd Applications
​println getLoanAt(1)​

В случае, если вы хотите распечатать все заявки на кредит, здесь закрытие вообще не нужно:

json.Loans.each {println it}​

Вот демонстрация для быстрого тестирования.

В случае, если вы хотите подать заявку на кредит по идентификатору, используйте ниже:

//To get all loan application by Id
def getApplicationById = {id -> json.Loans.Applications.flatten().find{id == it.id}}
println getApplicationById(3)

Краткая демонстрация вышеперечисленного.

person Rao    schedule 29.08.2018
comment
Можно ли использовать string для получения данных? Даже с какой-то другой библиотекой? В идеале хотелось бы что-то вроде json."Loan.Applications[1]", где "Loan.Applications[1]" будет строковым параметром в моем методе. - person usr4896260; 29.08.2018
comment
@ usr4896260, в приведенном выше решении упомянуто 3 подхода. Разве вы не можете позволить себе / осуществимо применить что-либо из этого? - person Rao; 29.08.2018
comment
Что именно вы хотите извлечь из приведенных выше данных? Вышеизложенное обеспечивает то, что вы упомянули, то есть getLoanAt похоже на (просто назвал его соответствующим образом) вместо myMethod. - person Rao; 29.08.2018
comment
Я обновил описание. В основном я хочу вызвать такой метод verifyElementsCountGreaterThanEqualTo(myJson, "Loans.Applications[1]", 3) Требование состоит в том, чтобы Loans.Applications[1] был путем к объекту json. Это должна быть строка, чтобы я мог повторно использовать функцию для разных результатов json. - person usr4896260; 29.08.2018

Вы можете попытаться преобразовать свой json в объект java Map, чтобы быть точным, после этого вы можете получить Loans как объект ArrayList.

def myJson = new JsonSlurper().parseText("{\"Errors\": [], \"Loans\": [{\"id\": 1}, {\"id\": 2}]}");
def loansList = myJson.Loans// ArrayList
person QuakeCore    schedule 28.08.2018
comment
Это был мой текущий подход. Однако мой фактический объект json содержит около 50 полей, каждое из которых имеет собственное вложение объектов/массивов. Я искал функцию, которая могла бы помочь сделать мой поиск таких свойств динамичным. Я пересмотрел свое описание. - person usr4896260; 29.08.2018

После долгих поисков я смог найти решение с уверенностью api.

Я могу использовать string для пути, который я ищу в объекте Json, следующим образом:

import io.restassured.path.json.JsonPath as JsonPath

def myJson = "{'Errors':[],'Loans':[{'Applications':[{'id':1,'name':'test'}]},{'Applications':[{'id':2,'name':'test3'},{'id':3,'name':'test3'}]}]}"    
def applicationData = JsonPath.with(myJson).get("Loans[0].Applications[1]")
def applicationsListData = JsonPath.with(myJson).get("Loans[0].Applications")
person usr4896260    schedule 29.08.2018