我目前正在开发一个应用程序,需要在文档 pdf 和相应的 JSON 数据文件之间创建映射。这些文件来自第三方,因此我无法控制它们的格式。我目前正在获取传入的 json 文件并将它们反序列化为 kotlin 数据类。下一步是获取反序列化生成的 Idoc 对象列表,并将它们转换为易于查找的数据结构。给定学生 ID、文档 imageCode 和所有者类型(从 pdf 文件名获取),我需要查找 Document.documentYear 值。最有效的方法是什么?
我目前的想法是简单地创建一个地图。所以给定一个
List<Idoc> idocs
我需要创建一个Map<Student.cbfId, Map<Document.imageCode, Map<DocumentOwner.type, Document>>>
。然而,我正在努力想出一种方法来实现这一点。我也不能 100% 确定这实际上是最好的方法。
我是否在尝试将数据构建为嵌套映射的正确轨道上,或者是否有更好的方法?如果地图是正确的方法,我该如何实际实现呢?
internal data class Idoc(@SerializedName("FileId") val fileId: String, @SerializedName("Student") val students: List<Student>)
internal data class Student(@SerializedName("Id") val id: String,
@SerializedName("SchoolId") val schoolId: String,
@SerializedName("Name") val name: String,
@SerializedName("Documents") val documents: List<Document>)
//Although owners is structured as a list, there will only ever be one Owner per Document
internal data class Document(
@SerializedName("Year") val documentYear: String,
@SerializedName("Code") val imageCode: String,
@SerializedName("DocumentOwner") val owners: List<DocumentOwner>,
)
internal data class DocumentOwner(@SerializedName("FirstName") val firstName: String,
@SerializedName("LastName") val lastName: String,
@SerializedName("OwnerType") val type: String
反映您的嵌套结构,您可以使用嵌套循环:
val map: Map<Triple<String, String, String>, Document> = buildMap {
for (idoc in idocs)
for (student in idocs.students)
for (document in student.documents)
for (owner in document.owners)
put(Triple(student.id, document.imageCode, owner.type), document)
}