Вот пример данных JSON, которые содержат вложенный массив объектов JSON.
def content = """[{
"student" : {
"studentId" : "ABC001",
"studentName" : "TOM"
},
"details" : {
"subjects" : {
"subjectDetails" : [{
"name" : "MATHS",
"rating" : 4
},
{
"name" : "SPANISH",
"rating" : 5
}
]
}
}
},
{
"student" : {
"studentId" : "DEF222",
"studentName" : "RICK"
},
"details" : {
"subjects" : {
"subjectDetails" : null
}
}
},
{
"student" : {
"studentId" : "XYZ444",
"studentName" : "AMY"
},
"details" : {
"subjects" : {
"subjectDetails" : [{
"name" : "MATHS",
"rating" : 6
},
{
"name" : "SPANISH",
"rating" : 7
},
{
"name" : "PHYSICS",
"rating" : 9
}
]
}
}
}]"""
Наличие контента JSON, содержащего несколько вложенных объектов массива JSON, который должен быть выделен как дочерние записи.
Пробовал приведенный ниже код, но хотел бы знать, есть ли эффективные способы сделать это, если есть несколько вложенных массивов.
Мой ожидаемый результат ниже.
def result = new JsonSlurper().parseText(content)
def header = "type," + result.collect{it.student.keySet()}.unique().flatten().join(",")
println header
def childHeader = {try {
result.details.subjects.subjectDetails.flatten().collect {it.keySet()}.unique().flatten().join(",")
} catch(Exception e) {'exception'}
}
result.collect {
students = it.student
studentsRecord = "Parent," + students.collect { it.value }.join(",")
println studentsRecord
subjects = it.details.subjects.subjectDetails
subjectsRecord = subjects.collect{"Subject-Children," + it.values().join(",")}.join("\n") ?:''
if (subjectsRecord)
println subjectsRecord
}
Выход:
type,studentId,studentName
Parent,ABC001,TOM
Subject-Children,MATHS,4
Subject-Children,SPANISH,5
Parent,DEF222,RICK
Parent,XYZ444,AMY
Subject-Children,MATHS,6
Subject-Children,SPANISH,7
Subject-Children,PHYSICS,9