Java使用json.simple库读取带数字键JSON文件的问题求助
如何用json.simple读取带数字字符串键的JSON对象?
问题描述
我正尝试使用json.simple库在Java中读取JSON文件,已查阅十余篇相关教程,但当前JSON文件的结构给我带来了诸多困扰。
JSON文件结构如下:
{ "0": { "POI": "43df8ad6f964a520b92e1fe3", "latitude": 40.731356448341, "longitude": -73.988671302795, "photos": "https://irs3.4sqi.net/img/general/612x612/343235_eezF7KZ55QpdVVNuMTFOO86bikjUbmrxb1IEuf2C1uI.jpg", "POI_category_id": "Arts & Entertainment", "POI_name": "AMC Loews Village 7" }, "1": { "POI": "4bfec352daf9c9b64038f9ef", "latitude": 40.75358312925, "longitude": -74.214450350548, "photos": "https://irs1.4sqi.net/img/general/540x720/c5xfqE_ajHOZb1LBtUBEdYNlc9aQ12EoPcavI_dVkDw.jpg", "POI_category_id": "Food", "POI_name": "Wendy's" } }
我的问题是,不知道如何获取"0"、"1"这类数字键对应的值,因为尝试用jsobj.get(i)(i为自增整数)完全无效。这是我第一次接触JSON相关操作,不确定思路是否正确,恳请解答。
解决方案
嘿,我明白你的困扰——这种数字字符串作为键的JSON结构确实容易让人踩坑,尤其是第一次用json.simple的时候。核心问题其实是键的类型不匹配,让我一步步帮你解决:
为什么jsobj.get(i)无效?
在json.simple中,解析后的根对象是JSONObject,它本质实现了Map接口,而JSON里的"0"、"1"这些键会被解析成字符串类型,不是整数。你用整数i作为参数调用get(),相当于在找整数类型的键,自然匹配不到字符串类型的"0"、"1",所以返回null。
方法1:遍历所有键值对(推荐,无需知道键的数量)
如果不确定JSON里有多少个POI条目,直接遍历根对象的所有键值对是最稳妥的方式:
import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import java.io.FileReader; public class JsonReader { public static void main(String[] args) { try { // 1. 解析JSON文件 JSONParser parser = new JSONParser(); JSONObject rootObj = (JSONObject) parser.parse(new FileReader("your-json-file.json")); // 2. 遍历所有键值对 for (Object keyObj : rootObj.keySet()) { String keyStr = (String) keyObj; // 把键转成字符串类型 JSONObject poiObj = (JSONObject) rootObj.get(keyStr); // 获取对应POI对象 // 3. 提取POI的属性 String poiId = (String) poiObj.get("POI"); double latitude = (double) poiObj.get("latitude"); double longitude = (double) poiObj.get("longitude"); String poiName = (String) poiObj.get("POI_name"); // 输出测试 System.out.printf("键:%s,POI名称:%s,坐标:%.6f, %.6f%n", keyStr, poiName, latitude, longitude); } } catch (Exception e) { e.printStackTrace(); } } }
方法2:按数字范围遍历(适合已知键的数量或范围)
如果你已经知道键是从0开始的连续数字,可以把整数转成字符串后再调用get():
// 假设你知道有2个POI条目 for (int i = 0; i < 2; i++) { String key = String.valueOf(i); // 将整数i转为字符串"0"、"1" JSONObject poiObj = (JSONObject) rootObj.get(key); if (poiObj != null) { // 处理POI对象,比如获取名称 System.out.println("POI名称:" + poiObj.get("POI_name")); } }
内容的提问来源于stack exchange,提问作者Sakis
相关产品推荐
相关产品推荐

