You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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();
        }
    }
}

代码说明

  1. 修正文件路径:你之前的代码里写的是new FileReader("ruta"),这会读取名为"ruta"的文件,应该替换成你的变量ruta
  2. 筛选Producto键:通过startsWith("Producto")判断键是否属于商品条目,确保只处理目标数据。
  3. 合并属性对象:因为你的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

火山引擎 最新活动