如何在Kotlin或Java中解析动态键JSON响应为字符串列表
动态键JSON值提取实现方案
你可以直接用主流JSON库的树解析或Map类型转换能力实现,无需预定义对应键的Model类,核心思路是将data节点直接转换为Map<String, String>类型,直接提取Map的values集合即可,以下是Jackson和Gson两种常用库的Java、Kotlin实现:
1. Jackson实现
Java版本
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; import java.util.Map; public class DynamicJsonParser { private static final ObjectMapper objectMapper = new ObjectMapper(); public static List<String> extractDataValues(String jsonContent) throws Exception { JsonNode root = objectMapper.readTree(jsonContent); JsonNode dataNode = root.get("data"); Map<String, String> dataMap = objectMapper.convertValue(dataNode, new TypeReference<Map<String, String>>() {}); return dataMap.values().stream().toList(); } }
Kotlin版本
import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper private val objectMapper: ObjectMapper = jacksonObjectMapper() fun extractDataValues(jsonContent: String): List<String> { val root: JsonNode = objectMapper.readTree(jsonContent) val dataMap = objectMapper.convertValue( root.get("data"), object : TypeReference<Map<String, String>>() {} ) return dataMap.values.toList() }
2. Gson实现
Java版本
import com.google.gson.Gson; import com.google.gson.JsonObject; import com.google.gson.reflect.TypeToken; import java.util.List; import java.util.Map; public class DynamicJsonParser { private static final Gson gson = new Gson(); public static List<String> extractDataValues(String jsonContent) { JsonObject root = gson.fromJson(jsonContent, JsonObject.class); JsonObject dataNode = root.getAsJsonObject("data"); Map<String, String> dataMap = gson.fromJson(dataNode, new TypeToken<Map<String, String>>(){}.getType()); return List.copyOf(dataMap.values()); } }
Kotlin版本
import com.google.gson.Gson import com.google.gson.JsonObject import com.google.gson.reflect.TypeToken private val gson = Gson() fun extractDataValues(jsonContent: String): List<String> { val root = gson.fromJson(jsonContent, JsonObject::class.java) val dataType = object : TypeToken<Map<String, String>>() {}.type val dataMap = gson.fromJson<Map<String, String>>(root.getAsJsonObject("data"), dataType) return dataMap.values.toList() }
以上实现对键的数量、键名没有任何要求,哪怕键数量过万也能正常解析,无额外性能损耗。
内容的提问来源于stack exchange,提问作者Abbas Khan Waliullahi
相关产品推荐
相关产品推荐

