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

Java11升级至Java17后JSONObject["metaData"]类型不匹配问题求助

问题描述

Java 11升级到Java 17后,出现错误:JSONObject["metaData"] is not a string (class org.json.JSONObject),该问题仅在JDK 17环境下出现,JDK 11中正常。触发场景为解析包含嵌套JSON元数据的字符串,且无法修改JSON结构(由文件导出生成)。已尝试升级JAX-RS和JBOSS组件,问题未解决。

解决方案

1. 升级org.json库版本

JDK 17对反射、模块系统的限制更严格,旧版本org.json存在兼容性问题。直接替换为最新稳定版,修改pom.xml:

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20240303</version>
</dependency>

2. 调整实体类字段映射

如果实体类中metaData字段原定义为String,但JSON中是嵌套对象,可通过两种方式适配:

  • 直接修改字段类型:将String改为JSONObject,适配嵌套结构:
public class TargetEntity {
    // 原定义:private String metaData;
    private JSONObject metaData;
    // 保留getter/setter
}
  • 自定义反序列化逻辑(以Jackson为例):如果必须保留String类型,添加反序列化器将嵌套对象转为JSON字符串:
public class MetaDataToStringDeserializer extends JsonDeserializer<String> {
    @Override
    public String deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        JsonNode node = parser.getCodec().readTree(parser);
        return node.toString();
    }
}

在实体类字段上标注:

@JsonDeserialize(using = MetaDataToStringDeserializer.class)
private String metaData;

3. 配置JDK 17模块权限

若项目使用模块化(module-info.java),需确保org.json模块被正确引用:

module your.project.module {
    requires org.json;
    // 若存在反射访问需求,添加opens权限:
    opens your.entity.package to org.json;
}

4. 替换JSON解析库

如果org.json的兼容性问题无法解决,可替换为对JDK 17支持更完善的Jackson或Gson:

  • Gson示例:自动适配嵌套对象转字符串或解析为实体类:
Gson gson = new Gson();
TargetEntity entity = gson.fromJson(jsonContent, TargetEntity.class);

内容的提问来源于stack exchange,提问作者Kaivalya Srivastava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:02:08