
本文介绍如何使用gson库将扁平化json对象中的所有键与对应值(数字或字符串)按顺序拼接成一个无分隔符的连续字符串,适用于日志标记、简易哈希输入等场景。
本文介绍如何使用gson库将扁平化json对象中的所有键与对应值(数字或字符串)按顺序拼接成一个无分隔符的连续字符串,适用于日志标记、简易哈希输入等场景。
在实际开发中,有时需要将JSON结构“扁平化”为紧凑的字符串形式(如用于生成轻量级签名、调试标识或兼容旧协议),而非标准格式化输出。本文提供一种简洁、可控的Java实现方案——基于Google Gson库,将JSON对象中每个键(key)与其原始值(value)直接拼接,不添加空格、冒号、逗号或引号,最终得到如 "Id200TimeStamp1596466800Animalcat" 这类纯字符序列。
该方案严格面向单层、无嵌套、值为基本类型(number/string) 的JSON对象设计,避免了通用序列化器引入的冗余格式开销,同时保持代码可读性与可维护性。
核心实现逻辑
- 使用 JsonParser.parseString() 解析输入JSON字符串为 JsonElement;
- 断言根节点为 JsonObject,确保结构合规;
- 遍历 entrySet(),依次获取键名与值元素;
- 对每个 JsonPrimitive 值,通过 isNumber() 判断类型:
- 若为数字(含整数/浮点),调用 getAsBigDecimal() 保证精度并避免科学计数法;
- 若为字符串,直接调用 getAsString();
- 所有键与处理后的值追加至 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 top-level object");
}
JsonObject jsonObj = root.getAsJsonObject();
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, JsonElement> entry : jsonObj.entrySet()) {
String key = entry.getKey();
JsonElement valueElem = entry.getValue();
if (!valueElem.isJsonPrimitive()) {
throw new IllegalArgumentException(
"Unsupported value type for key '" + key + "': nested objects/arrays not allowed"
);
}
JsonPrimitive primitive = valueElem.getAsJsonPrimitive();
sb.append(key);
if (primitive.isNumber()) {
// Use BigDecimal to preserve exact numeric representation (e.g., avoid 1596466800.0)
sb.append(primitive.getAsBigDecimal());
} else if (primitive.isString()) {
sb.append(primitive.getAsString());
} else {
throw new IllegalArgumentException(
"Only numbers and strings are supported; key '" + key + "' has unsupported type"
);
}
}
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(Maven):
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version> </dependency> - ⚠️ 健壮性边界:本实现不支持嵌套对象、数组、null 或布尔值。若输入可能含此类值,应在调用前校验或扩展类型处理逻辑。
- ? 数字精度保障:使用 getAsBigDecimal() 而非 getAsLong() 或 toString(),可准确处理大整数(如时间戳)及小数,避免因类型截断导致的意外结果(例如 1596466800.0 → 1596466800)。
- ? 键序问题:JsonObject.entrySet() 在 Gson 2.8.9+ 中保留插入顺序,但若需绝对确定性(如跨版本兼容),建议先对键名排序后再遍历:
jsonObj.keySet().stream().sorted().forEach(key -> { /* ... */ }); - ?️ 安全提示:生产环境若解析不可信JSON输入,应配合超时、深度限制等防护措施(Gson本身不内置JSON注入防护,但本场景无执行风险)。
综上,该方案以最小依赖、明确契约和清晰控制流,高效达成“键值无缝拼接”这一特定目标,是轻量级JSON后处理任务的理想选择。
立即学习“Java免费学习笔记(深入)”;










