Groovy:有效处理嵌套的JSON数组对象

时间:2019-05-16 21:51:38

标签: json groovy

这是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

1 个答案:

答案 0 :(得分: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"
    }
}

不确定如何通过

来衡量效率

您是否有“多个嵌套数组”的示例?