Java读取JSON技术问题:如何仅提取ProductoXX相关数据
解决方案:提取JSON中的Producto相关数据
首先,我们先明确你的JSON结构特点:顶层是一个JSONArray,其中的元素是JSONObject,每个JSONObject中包含多个以ProductoXX(或其他前缀)为键的条目,每个条目对应的值是一个JSONArray,而这个数组里的每个元素是仅含单个键值对的小JSONObject(比如{"crf":"4555424"})。
要提取所有ProductoXX相关数据,你可以按照以下步骤修改你的parseproductos方法:
修改后的读取代码
import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; import java.io.FileReader; import java.io.IOException; import java.util.Iterator; public class parse { routes router = new routes(); String ruta = router.getruta(); public parse() { // 构造函数保留 } public void parseproductos() { JSONParser parser = new JSONParser(); try { // 修正路径:使用变量ruta而非字符串"ruta" JSONArray topLevelArray = (JSONArray) parser.parse(new FileReader(ruta)); for (Object item : topLevelArray) { // 顶层数组的每个元素是JSONObject JSONObject obj = (JSONObject) item; // 遍历当前JSONObject的所有键 Iterator<String> keyIterator = obj.keySet().iterator(); while (keyIterator.hasNext()) { String key = keyIterator.next(); // 筛选以"Producto"开头的键 if (key.startsWith("Producto")) { // 获取该键对应的属性数组 JSONArray productAttrArray = (JSONArray) obj.get(key); // 合并所有单属性JSONObject为一个完整的Producto对象 JSONObject product = new JSONObject(); for (Object attrObj : productAttrArray) { JSONObject attr = (JSONObject) attrObj; // 取出单个属性的键和值 String attrKey = attr.keySet().iterator().next(); product.put(attrKey, attr.get(attrKey)); } // 现在product就是完整的商品对象,可以打印或处理 System.out.println("处理商品:" + key); System.out.println("商品信息:" + product.toJSONString()); // 这里可以把product添加到集合中存储,比如List<JSONObject> productsList } } } } catch (IOException | ParseException e) { e.printStackTrace(); } } }
代码说明
- 修正文件路径:你之前的代码里写的是
new FileReader("ruta"),这会读取名为"ruta"的文件,应该替换成你的变量ruta。 - 筛选Producto键:通过
startsWith("Producto")判断键是否属于商品条目,确保只处理目标数据。 - 合并属性对象:因为你的JSON中每个商品的属性是分散在多个小JSONObject里的,所以我们遍历这些小对象,把它们的键值对合并到一个完整的
JSONObject中,方便后续使用。
优化建议:改进JSON生成代码
当前生成的JSON结构(每个属性一个单独的JSONObject)会增加读取的复杂度,建议你修改生成代码,直接把商品的所有属性放到一个JSONObject中,示例如下:
// 原生成Producto的代码片段(优化后) while(rs.next()) { JSONArray productList = new JSONArray(); // 直接创建一个包含所有属性的JSONObject JSONObject productObj = new JSONObject(); productObj.put("crf", rs.getString("crf")); productObj.put("name", rs.getString("name")); productObj.put("desc", rs.getString("desc")); productObj.put("pve", rs.getString("pve")); productObj.put("pvp", rs.getString("pvp")); productObj.put("cdp", rs.getString("cdp")); productObj.put("familia", rs.getString("familia")); productObj.put("existencias", rs.getString("existencias")); // 把完整的商品对象添加到数组 productList.add(productObj); jobjtX.put("Producto"+i++, productList); }
这样优化后,读取时就不需要合并多个小JSONObject了,直接从数组中取出完整的商品对象即可,代码会更简洁高效。
内容的提问来源于stack exchange,提问作者Gyswus




