Java中POJO/DTO转JSON遇键带双引号问题求助
解决Gson转换POJO后Key/Value带双引号的问题
先给你理清核心问题:你从JsonObject.keySet()拿到的key本身是不带双引号的!你看到的"employee"这种带引号的输出,要么是打印JsonElement时的JSON格式特性,要么是你误把JSON格式字符串直接存入数据库了。下面一步步帮你解决:
1. 先确认Key本身的正确性
先做个简单测试,直接打印keySet里的key,你会发现它是干净的:
JsonObject obj = gson.toJsonTree(yourPojo).getAsJsonObject(); for (String key : obj.keySet()) { // 这里输出的key绝对不带双引号,比如是employee而不是"employee" System.out.println("原始Key: " + key); }
如果数据库里的key带引号,大概率是你错误地把某个JSON格式字符串当成key存进去了,而不是直接用keySet()返回的String类型key。
2. 正确提取Value(解决Value带引号的问题)
你之前用obj.get(key).toString()会输出该元素的标准JSON格式字符串——比如字符串类型的Value会被自动包裹在双引号里,这就是你看到引号的根源。要获取不带引号的实际值,需要根据JsonElement的类型针对性提取:
不同类型Value的提取方式:
- 字符串类型:用
getAsString()直接获取不带引号的字符串 - 数字类型:用
getAsInt()/getAsLong()/getAsDouble()等方法提取对应数值 - 布尔类型:用
getAsBoolean()提取布尔值 - 嵌套对象/数组:如果要存JSON字符串,用
gson.toJson()格式化;如果要解析则转成JsonObject/JsonArray
完整示例代码
Gson gson = new Gson(); JsonObject obj = gson.toJsonTree(yourPojoInstance).getAsJsonObject(); for (String key : obj.keySet()) { JsonElement element = obj.get(key); String cleanValue; if (element.isJsonPrimitive()) { JsonPrimitive primitive = element.getAsJsonPrimitive(); if (primitive.isString()) { cleanValue = primitive.getAsString(); // 提取不带引号的纯字符串 } else if (primitive.isBoolean()) { cleanValue = String.valueOf(primitive.getAsBoolean()); } else if (primitive.isNumber()) { cleanValue = primitive.getAsNumber().toString(); } else { cleanValue = element.toString(); // 兜底处理特殊类型 } } else if (element.isJsonObject()) { // 嵌套对象转JSON字符串,避免格式混乱 cleanValue = gson.toJson(element.getAsJsonObject()); } else if (element.isJsonArray()) { cleanValue = gson.toJson(element.getAsJsonArray()); } else { cleanValue = element.toString(); } // 现在key和cleanValue都不带多余双引号,可直接插入数据库 System.out.println("Key: " + key + " | 处理后Value: " + cleanValue); }
3. 额外优化建议
如果你的POJO包含空值、日期等特殊字段,可以给Gson配置序列化规则,避免意外格式问题:
Gson gson = new GsonBuilder() .serializeNulls() // 序列化空值 .setDateFormat("yyyy-MM-dd HH:mm:ss") // 统一日期序列化格式 .create();
内容的提问来源于stack exchange,提问作者Srikanth Janapati
相关产品推荐
相关产品推荐

