Java中向JsonObject存入数据时put()方法报错求助
解决Gson JsonObject.put() 传入int类型参数的编译错误
嗨,我来帮你搞定这个编译错误的问题!你遇到的报错,核心原因是com.google.gson.JsonObject的put()方法并不直接支持传入int这类基本数据类型的参数。
为什么会报错?
Gson的JsonObject类里,put(String name, JsonElement value)这个方法要求第二个参数必须是JsonElement的子类(比如JsonPrimitive、JsonObject、JsonArray这些)。而你直接传入的int是Java基本数据类型,不属于JsonElement的体系,编译器找不到匹配的方法重载,就会抛出你看到的"symbol: method put (java.lang.String, int)"错误。
两种解决办法
1. 使用addProperty()方法(推荐)
Gson专门为基本数据类型和字符串提供了addProperty()方法,它会自动把int、String这类类型包装成对应的JsonPrimitive对象,用法简单又符合官方规范。修改你的代码如下:
while (res.next()) { JsonObject jo = new JsonObject(); jo.addProperty("account_id", res.getInt("account_id")); jo.addProperty("mandant_id", res.getInt("mandant_id")); jo.addProperty("id", res.getInt("id")); jo.addProperty("sourcedata", res.getString("sourcedata")); ja.add(jo); }
2. 手动包装为JsonPrimitive(不推荐,仅作了解)
如果你一定要用put()方法,需要手动把int包装成JsonPrimitive对象,代码如下:
while (res.next()) { JsonObject jo = new JsonObject(); jo.put("account_id", new JsonPrimitive(res.getInt("account_id"))); jo.put("mandant_id", new JsonPrimitive(res.getInt("mandant_id"))); jo.put("id", new JsonPrimitive(res.getInt("id"))); jo.put("sourcedata", new JsonPrimitive(res.getString("sourcedata"))); ja.add(jo); }
这种写法比addProperty()繁琐,除非有特殊场景需求,不然不建议用。
额外的优化建议
你的代码还有一个潜在的资源泄漏问题:数据库连接、PreparedStatement和ResultSet都没有手动关闭。建议使用Java的try-with-resources语句来自动管理这些资源,它会在代码块结束后自动关闭所有实现了AutoCloseable接口的对象,避免内存泄漏。修改后的代码结构如下:
public String viewdata() { String data = ""; JsonArray ja = new JsonArray(); // 用try-with-resources自动管理资源 try (Connection conn = c.getconn(); PreparedStatement pre = conn.prepareStatement("SELECT * FROM n_pares"); ResultSet res = pre.executeQuery()) { while (res.next()) { JsonObject jo = new JsonObject(); jo.addProperty("account_id", res.getInt("account_id")); jo.addProperty("mandant_id", res.getInt("mandant_id")); jo.addProperty("id", res.getInt("id")); jo.addProperty("sourcedata", res.getString("sourcedata")); ja.add(jo); } data = ja.toString(); } catch(SQLException ex) { Logger.getLogger(n_paresmodul.class.getName()).log(Level.SEVERE, null, ex); } return data; }
内容的提问来源于stack exchange,提问作者Hubi
相关产品推荐
相关产品推荐

