存在映射时JSONObject.get(key)返回null问题排查
我之前也碰到过一模一样的坑!明明控制台输出的JSON里清清楚楚有"partner":"website",但调用get("partner")却返回null,这种情况多半不是代码逻辑的问题,而是下面几个容易忽略的细节导致的,给你逐个排查:
1. 编码问题(最常见的元凶)
你用FileReader读取文件的话,它会默认用系统的默认编码来解码文件,但如果你的JSON文件是UTF-8编码(尤其是带BOM的UTF-8),而系统默认编码是GBK之类的,就会导致解析出来的键被悄悄加上了隐形的乱码字符(比如开头的BOM标记\uFEFF)。表面上toJSONString()输出的是"partner",但实际键是"\uFEFFpartner",自然用普通的"partner"查不到值。
解决办法:换用InputStreamReader指定UTF-8编码读取,彻底规避编码差异:
import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import java.io.FileInputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; public class JsonTest { public static void main(String[] args) throws Exception { String path = "SomePathHere"; JSONParser parser = new JSONParser(); // 明确指定UTF-8编码读取文件 JSONObject json = (JSONObject) parser.parse( new InputStreamReader(new FileInputStream(path), StandardCharsets.UTF_8) ); System.out.println("JSONObject: " + json.toJSONString()); String partner = (String) json.get("partner"); System.out.println(partner); // 这下应该能输出"website"了 } }
2. 导包冲突搞的鬼
如果你的项目里同时引入了多个JSON库(比如org.json、json-lib和json-simple),很可能不小心导入了错误的JSONObject类——比如你以为用的是org.json.simple.JSONObject,但实际导入的是其他库的JSONObject,它们的get方法逻辑可能不一样,导致取不到值。
解决办法:
- 检查你的import语句,确保是
import org.json.simple.JSONObject;和import org.json.simple.parser.JSONParser;; - 如果实在分不清,直接用全限定类名来声明变量,避免混淆:
org.json.simple.JSONObject json = (org.json.simple.JSONObject) parser.parse(new FileReader(path));
3. JSON键里藏了隐形字符
有时候JSON文件里的键看起来是"partner",但实际带有空格、全角空格或者其他Unicode隐形字符(比如" partner"或者"partner "),肉眼根本看不出来,但get方法是严格匹配字符串的,自然返回null。
解决办法:
- 用文本编辑器的“显示所有字符”功能(比如Notepad++的「视图→显示符号→显示所有字符」)打开JSON文件,检查键是否有多余的字符;
- 或者在代码里遍历所有键,打印出实际的键内容和长度:
for (Object key : json.keySet()) { String keyStr = (String) key; System.out.println("实际键值: '" + keyStr + "' | 字符长度: " + keyStr.length()); }
如果输出的长度不是7("partner"刚好7个字符),就说明键里有隐形字符,修正JSON文件即可。
4. 旧版本json-simple的bug
如果以上都没问题,那可能是你用的json-simple版本太旧,存在解析bug。比如早期版本处理某些特殊格式的JSON时会出现异常情况。
解决办法:
更新到最新的稳定版(目前是1.1.1),如果用Maven的话,在pom.xml里配置:
<dependency> <groupId>com.googlecode.json-simple</groupId> <artifactId>json-simple</artifactId> <version>1.1.1</version> </dependency>
内容的提问来源于stack exchange,提问作者TKM

