
本文介绍如何使用 gson 库将 json 对象中所有键与对应值(支持数字和字符串)按原始顺序拼接成一个连续字符串,适用于扁平化、轻量级序列化或签名生成等场景。
本文介绍如何使用 gson 库将 json 对象中所有键与对应值(支持数字和字符串)按原始顺序拼接成一个连续字符串,适用于扁平化、轻量级序列化或签名生成等场景。
在实际开发中,有时需要将 JSON 数据“扁平化”为紧凑的字符串形式,例如用于简易哈希签名、日志标记或与遗留系统对接。不同于标准序列化(如 toString() 或 toJson()),本需求要求完全去除空格、引号、逗号、花括号等 JSON 语法符号,并将每个键与其值直接相连,且不添加任何分隔符——即 { "Id": 200, "TimeStamp": 1596466800, "Animal": "cat" } → "Id200TimeStamp1596466800Animalcat"。
实现该逻辑的关键在于:
✅ 正确解析 JSON 并遍历键值对;
✅ 区分数值型(int, long, double 等)与字符串型值,避免引号包裹;
✅ 使用 StringBuilder 高效拼接,保障性能;
✅ 明确处理限制条件(如不支持嵌套对象、数组或 null 值)。
以下为基于 Google Gson(v2.10+)的完整可运行示例:
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 JsonKeyValConcatenator {
/**
* 将 JSON 字符串中的顶层键值对拼接为无分隔符字符串
* 注意:仅支持扁平对象(无嵌套)、值类型限于数字或字符串
*/
public static String concatKeysAndValues(String json) {
JsonElement root = JsonParser.parseString(json);
if (!root.isJsonObject()) {
throw new IllegalArgumentException("Input must be a valid JSON object");
}
JsonObject jsonObject = root.getAsJsonObject();
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
String key = entry.getKey();
JsonElement value = entry.getValue();
if (!value.isJsonPrimitive()) {
throw new UnsupportedOperationException(
"Unsupported value type for key '" + key + "': nested objects/arrays not allowed"
);
}
JsonPrimitive primitive = value.getAsJsonPrimitive();
sb.append(key);
if (primitive.isNumber()) {
// 使用 getAsBigDecimal() 可精确保留整数/浮点数,避免 double 精度丢失
sb.append(primitive.getAsBigDecimal());
} else if (primitive.isBoolean()) {
sb.append(primitive.getAsBoolean());
} else {
// isString() 或其他类型(如 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
}
}? 注意事项与最佳实践:
-
依赖引入:Maven 中添加
;com.google.code.gson gson 2.10.1 - 顺序保证:Gson 的 JsonObject.entrySet() 在 Java 7+ 中不保证插入顺序。如需严格按 JSON 原始字段顺序(如 "Animal" 必须在 "TimeStamp" 后),应改用 JsonParser 结合 JsonStreamParser 手动解析,或选用 Jackson(ObjectMapper 配合 JsonNode.fields() + LinkedHashMap);
- 健壮性增强:生产环境建议增加 null 值校验、非 ASCII 键名处理、异常统一包装;
- 性能提示:对高频调用场景,可预编译 JsonParser 实例(Gson 是线程安全的),避免重复创建。
该方案简洁、可控、易于集成,是解决“无格式键值拼接”这一特定需求的高效实践路径。










