Java JSONObject和JDBC返回格式json不正确

Java JSONObject和JDBC返回格式json不正确,java,json,database,jdbc,Java,Json,Database,Jdbc,我在我的小项目中遇到了一个问题。我已经花了大约4天的时间,还没有最好的解决方案 这是我的源代码: public static JSONObject fetchPersonCarInfo() throws Exception { // get data from 2 tables: Cars and Manufacturer String query = "SELECT * from mytable"; statement =

我在我的小项目中遇到了一个问题。我已经花了大约4天的时间,还没有最好的解决方案

这是我的源代码:

public static JSONObject fetchPersonCarInfo() throws Exception {

    // get data from 2 tables: Cars and Manufacturer            
    String query = "SELECT * from mytable";       
        statement = connection.prepareStatement(query);         
        rs = statement.executeQuery();
        JSONArray carsArray = null;                         
        while(rs.next()) {

            carObj.put("id", (new  string(rs.getString("id"))));                    


            carsArray.put(carObj);

            for(int i=0 ; i< carsArray.length() ; i++) {

            manufacturerObj.put(new String(rs.getString("manufacturer_id")), carsArray);
            manufacturerObj.put(new String(rs.getString("manufacturer_name")), carsArray);
            }
            System.out.println(manufacturerObj.toString());
    }
            System.out.println("Ok");
    }
    catch (Exception e) {
        // TODO Auto-generated catch block
        if (connection != null) {
            connection.close();
        }
            throw e;
    } 
    finally {
            if (connection != null) {
                connection.close();
        }
    }

    return manufacturerObj; 
}        

如何更改代码以构建正确的json格式。非常感谢……

carObj部分很好,因此我建议将其作为一种方法

public static JSONObject getCarJSON(String id, String name, String price) {
    JSONObject carObj = new JSONObject();                   
    carObj.put("id", id);                    
    carObj.put("name", name);
    carObj.put("price", price);
    return carObj;
}
你的问题似乎就在这里。您正在将一个
personCarObj
添加到
carsArray
。那可能只包括汽车

JSONObject personCarObj = new JSONObject();                         
personCarObj.put("manufacturer_id", (new String(rs.getString("manufacturer_id"))));
personCarObj.put("manufacturer_name", (new String(rs.getString("manufacturer_name"))));
carsArray.put(personCarObj); 
在这里。对于
carsArray
中的每个“car”,您都将一个键值对放入
manufacturerObj
中,其中值始终相同
carsArray
<代码>制造商Robj可能只包含制造商信息

for(int i=0 ; i< carsArray.length() ; i++) {

    manufacturerObj.put(new String(rs.getString("manufacturer_id")), carsArray);
    manufacturerObj.put(new String(rs.getString("manufacturer_name")), carsArray);
}
下面的代码可能很接近(警告:未测试)。创建地图的原因是,当您已经看到制造商时,可以捕获数据,然后附加数据,而不是复制数据

JSONArray manufacturerArray = new JSONArray();
HashMap<String, JSONArray> manufacturerMap = new HashMap<String, JSONArray>();

while(rs.next()) {
    String mId = rs.getString("manufacturer_id");
    JSONArray carsArray = manufacturerMap.get(mId);
    if (carsArray == null) {
        carsArray = new JSONArray();
        manufacturerMap.put(mId, carsArray);
    }
    JSONObject manufacturer = new JSONObject();                         
    manufacturer.put("id", mId);
    manufacturer.put("name", rs.getString("manufacturer_name"));                  

    String carId = rs.getString("id");                    
    String carName = rs.getString("name");
    String carPrice = rs.getString("price");
    carsArray.put(getCarJSON(carId, carName, carPrice));

    manufacturer.put("cars", carsArray);
    manufacturerArray.put(manufacturer);
}
JSONObject result = new JSONObject();
result.put("manufacturers", manufacturerArray);
JSONArray manufactureraray=new JSONArray();
HashMap manufacturerMap=新的HashMap();
while(rs.next()){
字符串mId=rs.getString(“制造商id”);
JSONArray carsArray=manufacturerMap.get(mId);
if(carsArray==null){
carsArray=new-JSONArray();
制造商映射放置(mId,carsArray);
}
JSONObject manufacturer=新的JSONObject();
制造商。放置(“id”,mId);
manufacturer.put(“name”,rs.getString(“manufacturer_name”);
字符串carId=rs.getString(“id”);
字符串carName=rs.getString(“名称”);
字符串carPrice=rs.getString(“价格”);
carsArray.put(getCarJSON(carId、carName、carPrice));
制造商。put(“汽车”,carsArray);
制造商RAY.put(制造商);
}
JSONObject结果=新建JSONObject();
结果。put(“制造商”,Manufactureraray);

你可以用Jackson/Gson做一些像这样的POJO

class Manufacturer {
    String id, name;
    List<Car> cars;
} 

class Car {
    String id, name, price;
}
类制造商{
字符串id、名称;
列出车辆清单;
} 
班车{
字符串id、名称、价格;
}

然后你会序列化一个
列表

你的第一个代码示例不是JSONI会推荐类似
{“制造商”:[{“id”:1,“名称”:“本田”,“汽车”:[…]},{“id”:2,“名称”:“丰田”,“汽车”:[…]}}
亲爱的cricket_007,是的,我的第一个代码不是Json,它只是Json格式供我参考输出。我想我的第二个密码有错误的地方要听。不客气。你可以表示感谢,也许这是我最好的解决办法。感谢您的支持如果需要,您也可以将id和价格解析为int/double是的,也许我会选择价格类型为double,例如:1500000越南盾(越南货币)。
JSONArray manufacturerArray = new JSONArray();
HashMap<String, JSONArray> manufacturerMap = new HashMap<String, JSONArray>();

while(rs.next()) {
    String mId = rs.getString("manufacturer_id");
    JSONArray carsArray = manufacturerMap.get(mId);
    if (carsArray == null) {
        carsArray = new JSONArray();
        manufacturerMap.put(mId, carsArray);
    }
    JSONObject manufacturer = new JSONObject();                         
    manufacturer.put("id", mId);
    manufacturer.put("name", rs.getString("manufacturer_name"));                  

    String carId = rs.getString("id");                    
    String carName = rs.getString("name");
    String carPrice = rs.getString("price");
    carsArray.put(getCarJSON(carId, carName, carPrice));

    manufacturer.put("cars", carsArray);
    manufacturerArray.put(manufacturer);
}
JSONObject result = new JSONObject();
result.put("manufacturers", manufacturerArray);
class Manufacturer {
    String id, name;
    List<Car> cars;
} 

class Car {
    String id, name, price;
}