You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:50:30