
json标准不允许同一对象内存在重复键,java解析器会自动覆盖前值只保留最后一个,因此需先修正json结构为合法格式,再用jackson或gson统一读取statements数组。
json标准不允许同一对象内存在重复键,java解析器会自动覆盖前值只保留最后一个,因此需先修正json结构为合法格式,再用jackson或gson统一读取statements数组。
在实际开发中,若遇到类似如下非法JSON片段(表面看似两个"statements"字段,实则违反RFC 8259规范):
{
"statements": [ { "kpCustomLevel": { "region": "KNW", "statementType": "Medical", "coverageType": "DHMO" } } ],
"statements": [ { "kpCustomLevel": { "region": "KNP", "statementType": "Medical1", "coverageType": "DHMN" } } ]
}
Java主流JSON库(如Jackson、Gson)均严格遵循标准:当解析器遇到重复键时,后出现的值将覆盖前一个值,最终仅保留第二个"statements"数组——这正是您只获取到最后一条记录的根本原因。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
✅ 正确做法是重构JSON为合法结构:将多个statements合并为单个键,其值为包含全部条目的数组:
{
"statements": [
{
"kpCustomLevel": {
"region": "KNW",
"statementType": "Medical",
"coverageType": "DHMO"
}
},
{
"kpCustomLevel": {
"region": "KNP",
"statementType": "Medical1",
"coverageType": "DHMN"
}
}
]
}
使用Jackson解析示例(推荐)
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.util.List;
// 定义嵌套数据结构
class KpCustomLevel {
private String region;
private String statementType;
private String coverageType;
// getter/setter省略,或使用Lombok
}
class Statement {
@JsonProperty("kpCustomLevel")
private KpCustomLevel kpCustomLevel;
// getter/setter
}
class JsonRoot {
private List<statement> statements;
// getter/setter
}
// 解析代码
ObjectMapper mapper = new ObjectMapper();
JsonRoot root = mapper.readValue(new File("data.json"), JsonRoot.class);
List<statement> allStatements = root.getStatements(); // ✅ 获取全部2个对象</statement></statement>
注意事项与最佳实践
- ? 切勿依赖“解析重复键”:任何标准JSON库都不保证保留重复键,行为不可移植且易引发线上故障;
- ✅ 源头治理优先:推动上游系统/文件生成方输出合规JSON(单statements数组);
- ⚠️ 若无法修改源JSON(如遗留文件),可先用正则或流式解析(JsonParser)手动提取所有"statements": [...]片段,再分别反序列化——但属兜底方案,不推荐长期使用;
- ? Jackson默认启用STRICT_DUPLICATE_DETECTION,若需调试可临时禁用(mapper.configure(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY, false)),但仅用于诊断,不可用于生产逻辑。
综上,解决该问题的核心不是“绕过限制读取重复键”,而是回归JSON语义本质:用数组表达集合,用唯一键组织结构。修正数据格式后,解析即自然支持批量读取与后续业务处理。










