在Android Kotlin中如何获取JSON数组
Android Kotlin中解析无键JSON数组的方案
这个JSON数组是纯字符串序列,没有键值对映射,所有数据按固定顺序排列。要处理它,核心是先明确每个索引对应的字段含义,再通过索引提取数据并封装成结构化对象。
步骤1:明确字段与索引的对应关系
先梳理数组中各位置的含义(忽略无意义的空字符串和标签项):
- 索引1-4:证件标题("PAKISTAN", "National", "Identity", "Card")
- 索引5-8:国家副标题("ISLAMIC", "REPUBLIC", "OF", "PAKISTAN")
- 索引10-12:持证人姓名
- 索引13:地址行(可选)
- 索引16-18:父亲姓名
- 索引22:性别
- 索引23-24:居住国
- 索引29:身份证号
- 索引30:出生日期
- 索引38:签发日期
- 索引39:有效期截止日期
步骤2:解析JSON数组
可以用Android自带的org.json库,或者第三方库如Gson/Moshi来解析JSON字符串为字符串列表。
用Android自带org.json解析:
import org.json.JSONArray // 原始JSON字符串 val rawJson = """["", "PAKISTAN", "National", "Identity", "Card", "ISLAMIC", "REPUBLIC", "OF", "PAKISTAN", "Name", "Saad", "Hanif", "Qureshi", "3-3-20", "Father", "Name", "Muhammad", "Hanif", "Qureshi", "Gender", "Country", "of", "Stay", "M", "Saudi", "Arabia", "Identity", "Number", "Date", "of", "Birth", "42301-6685580-7", "13.06.1986", "38902", "Date", "of", "Issue", "Date", "of", "Expiry", "06.01.2021", "06.01.2031", "Holder's", "Signature"]""" // 解析为字符串列表 val jsonArray = JSONArray(rawJson) val dataList = mutableListOf<String>() for (i in 0 until jsonArray.length()) { dataList.add(jsonArray.getString(i)) }
用Gson解析(需添加Gson依赖):
import com.google.gson.Gson val gson = Gson() val dataList: List<String> = gson.fromJson(rawJson, Array<String>::class.java).toList()
步骤3:封装结构化数据
定义数据类来存储解析后的信息,方便后续业务处理:
data class PakistanNationalIdCard( val cardTitle: String, val countryTitle: String, val fullName: String, val addressLine: String?, val fatherFullName: String, val gender: String, val countryOfStay: String, val identityNumber: String, val dateOfBirth: String, val dateOfIssue: String, val dateOfExpiry: String )
步骤4:提取数据并做边界检查
编写解析函数,通过索引提取数据,同时加入边界检查避免数组越界异常:
fun parseIdCard(dataList: List<String>): PakistanNationalIdCard? { // 确保数组长度足够覆盖所有需要提取的字段 if (dataList.size < 40) return null return PakistanNationalIdCard( cardTitle = dataList.subList(1, 5).joinToString(" "), countryTitle = dataList.subList(5, 9).joinToString(" "), fullName = dataList.subList(10, 13).joinToString(" "), addressLine = if (dataList[13].isNotBlank()) dataList[13] else null, fatherFullName = dataList.subList(16, 19).joinToString(" "), gender = dataList[22], countryOfStay = dataList.subList(23, 25).joinToString(" "), identityNumber = dataList[29], dateOfBirth = dataList[30], dateOfIssue = dataList[38], dateOfExpiry = dataList[39] ) }
步骤5:日期格式转换(可选)
如果需要将日期字符串转为日期对象,可使用Java Time API:
import java.time.LocalDate import java.time.format.DateTimeFormatter fun convertToLocalDate(dateStr: String): LocalDate? { val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy") return try { LocalDate.parse(dateStr, formatter) } catch (e: Exception) { // 处理日期格式错误 null } } // 使用示例 val idCard = parseIdCard(dataList) idCard?.let { val birthDate = convertToLocalDate(it.dateOfBirth) println("持证人姓名: ${it.fullName}") println("出生日期: ${birthDate ?: "格式错误"}") }
注意事项
- 该解析逻辑依赖数组的固定顺序,如果数据源的字段顺序发生变化,解析结果会出错,需确保数据源格式稳定
- 必须添加边界检查,避免因数组长度不足导致
IndexOutOfBoundsException - 对于可选字段(如示例中的addressLine),要判断是否为空后再处理
内容的提问来源于stack exchange,提问作者Sikandar Yousuf
相关产品推荐
相关产品推荐

