Groovy: эффективная обработка вложенных объектов массива JSON

Вот пример данных 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("
") ?:''
    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

Всего 1 ответ


Вы можете сократить это до:

def result = new JsonSlurper().parseText(content)

println "type,${result.student.head().keySet().join(',')}"
result.each { student ->
    println "Parent,${student.student.values().join(',')}"
    student.details.subjects.subjectDetails.each {
        println "Subject-Children,$it.name,$it.rating"
    }
}

Не уверен, как вы хотите измерить эффективность, хотя ?

У вас есть пример с «несколькими вложенными массивами»?


Есть идеи?

10000