
本文介绍如何使用gson库高效地将扁平json对象(无嵌套)的所有键与对应值(支持数字和字符串)按顺序拼接成一个连续字符串,适用于日志标记、简易哈希生成等场景。
本文介绍如何使用gson库高效地将扁平json对象(无嵌套)的所有键与对应值(支持数字和字符串)按顺序拼接成一个连续字符串,适用于日志标记、简易哈希生成等场景。
在实际开发中,有时需要将JSON对象的结构“扁平化”为纯字符串形式,且不添加分隔符、空格或引号——例如用于轻量级签名、缓存键构造或调试标识。本教程提供一种简洁、可复用的Java实现方案,基于Google Gson库,精准满足此类需求。
核心思路
- 解析JSON字符串为JsonObject;
- 遍历其所有键值对(entrySet()),严格保持插入顺序(Gson 2.8.9+ 的JsonObject默认维持插入序);
- 对每个值进行类型判断:数字类型(isNumber())转为BigDecimal避免浮点精度丢失;字符串类型直接取原始值;
- 使用StringBuilder高效拼接键名与值,零开销构建结果。
完整示例代码
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;
import java.math.BigDecimal;
import java.util.Map;
import java.util.Set;
public class JsonKeyConcatenator {
public static String concatKeysAndValues(String json) {
JsonElement root = JsonParser.parseString(json);
if (!root.isJsonObject()) {
throw new IllegalArgumentException("Input JSON must be a JSON object");
}
JsonObject jsonObj = root.getAsJsonObject();
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, JsonElement> entry : jsonObj.entrySet()) {
String key = entry.getKey();
JsonElement value = entry.getValue();
if (!value.isJsonPrimitive()) {
throw new IllegalArgumentException(
"Unsupported value type for key '" + key + "': nested objects/arrays not allowed"
);
}
JsonPrimitive primitive = value.getAsJsonPrimitive();
sb.append(key);
if (primitive.isNumber()) {
// 使用 BigDecimal 保证整数/小数均无精度损失
sb.append(primitive.getAsBigDecimal());
} else if (primitive.isBoolean()) {
sb.append(primitive.getAsBoolean());
} else {
// 字符串或 null(若需处理 null,可在此分支添加逻辑)
sb.append(primitive.getAsString());
}
}
return sb.toString();
}
// 测试入口
public static void main(String[] args) {
String input = "{ \"Id\": 200, \"TimeStamp\": 1596466800, \"Animal\": \"cat\" }";
String result = concatKeysAndValues(input);
System.out.println(result); // 输出:Id200TimeStamp1596466800Animalcat
}
}注意事项与最佳实践
- ✅ 依赖要求:需引入 Gson 2.8.9 或更高版本(Maven坐标:com.google.code.gson:gson:2.10.1);
- ⚠️ 限制明确:该方案仅支持一级扁平JSON对象,不处理数组、嵌套对象或null值(如需支持null,可在else分支中追加sb.append("null"));
- ? 健壮性增强:生产环境建议增加输入校验(如空值、格式异常捕获)和类型安全断言;
- ? 顺序保障:Gson 的 JsonObject 在 Java 8+ 中基于 LinkedHashMap 实现,天然保持字段声明顺序;若需跨平台强一致性,建议预排序键名(如 jsonObj.keySet().stream().sorted().forEach(...));
- ? 扩展提示:如需添加分隔符(如Id=200|TimeStamp=1596466800),只需修改sb.append(key)为sb.append(key).append("=")即可灵活适配。
通过此方法,开发者可在数行代码内完成JSON键值的无损、有序、高性能拼接,兼顾可读性与工程实用性。










