1. 概述

在这个教程中,我们将探讨如何使用Java去除JSON数据中的多余空格,以实现数据压缩。

在许多情况下,我们需要对提供的JSON数据进行优化存储,或者去除多余的空格以便于轻松比较多个JSON对象。我们将利用Jackson和Gson库的功能来实现这一目标,这两个库对于处理JSON数据非常有帮助。

2. 使用自定义逻辑移除空格

JSON数据通常用冒号(":")分隔键和值,用逗号(",")分隔键值对。由于JSON键被引号(' " ')包围,并且字符串使用转义序列,我们可以实现一个逐字符读取并构建无多余空格的JSON字符串的逻辑。

仔细处理字符,同时考虑引用部分和转义序列,可以确保输出的JSON是干净且格式正确的:

public String removeExtraWhiteSpaces(String jsonString) {
    StringBuilder result = new StringBuilder(json.length());
    boolean inQuotes = false;
    boolean escapeMode = false;
    for (char character : json.toCharArray()) {
        if (escapeMode) {
            result.append(character);
            escapeMode = false;
        } else if (character == '"') {
            inQuotes = !inQuotes;
            result.append(character);
        } else if (character == '\\') {
            escapeMode = true;
            result.append(character);
        } else if (!inQuotes && character == ' ') {
            continue;
        } else {
            result.append(character);
        }
    }
    return result.toString();
}

假设我们有一个名为inputJson的变量,其中包含以下JSON字符串:

{
    "name" : "John",
    "address" : "New       York",
    "age" : 30,
    "phoneNumber" : 9999999999
}

我们希望得到的去除非空格的JSON字符串(定义为expectedJson)如下:

{"name":"John","address":"New       York","age":30,"phoneNumber":9999999999}

现在,让我们读取inputJson作为字符串并去除空格:

@Test
public void givenWhiteSpaceRemoval_whenJsonContainWhitespaces_thenWhitespaceRemoved() {
    String result = removeExtraWhitespaces(inputJson);
    assertEquals(expectedJson, result); 
}

3. 使用Jackson去除空格

要使用Jackson去除空格,首先在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

强烈建议使用Maven中央仓库中最新的版本,例如Jackson的jackson-databind库:

public String removeExtraWhitespacesUsingJackson(String json) {
    ObjectMapper objectMapper = new ObjectMapper();
    JsonNode jsonNode = objectMapper.readTree(json);
    return objectMapper.writeValueAsString(jsonNode); 
}

假设我们有一个名为inputJson的变量,其中包含以下JSON字符串:

{
    "name" : "John",
    "address" : "New       York",
    "age" : 30,
    "phoneNumber" : 9999999999
}

我们期望的去除非空格的JSON字符串(定义为expectedJson)如下:

{"name":"John","address":"New       York","age":30,"phoneNumber":9999999999}

使用inputJson作为字符串并去除空格:

@Test
public void giveWhiteSpaceRemovalUsingJackson_whenJsonContainWhitespaces_thenWhitespaceRemoved(){
    String result = removeExtraWhitespaceUsingJackson(inputJson);   
    assertEquals(expectedJson, result);
}

4. 使用Gson去除空格

首先,我们在项目中添加Gson的Maven依赖:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>

我们建议始终使用Maven中央仓库中最新的Gson库版本,如gson

为了从JSON字符串中去除空格,我们需要使用自定义的JsonSerializer

我们将创建一个自定义的StringSerializer,用于修剪JSON字符串值中的空格。通过在GsonBuilder中注册此序列化器,Gson将应用自定义的字符串序列化逻辑,从而在保留JSON结构的同时移除值中的空格:

public String removeWhitespacesUsingGson(String json) {
    Gson gson = new GsonBuilder().registerTypeAdapter(String.class, new StringSerializer()).create();
    JsonElement jsonElement = gson.fromJson(json, JsonElement.class);
    return gson.toJson(jsonElement);
}

class StringSerializer implements JsonSerializer<String> {
    @Override
    public JsonElement serialize(String src, Type typeOfSrc, JsonSerializationContext context) {
        return new JsonPrimitive(src.trim());
    }
}

同样使用inputJson变量,它包含以下JSON字符串:

{
    "name" : "John",
    "address" : "New       York",
    "age" : 30,
    "phoneNumber" : 9999999999
}

期望生成的去除非空格的JSON字符串(定义为expectedJson):

{"name":"John","address":"New       York","age":30,"phoneNumber":9999999999}

使用inputJson去除空格:

@Test
public void giveWhitespaceRemovalUsingGson_whenJsonContainsWhitespaces_thenWhitespaceRemoved() {
    String result = removeWhitespacesUsingGson(inputJson);
    assertEquals(expectedJson, result);
}

5. 总结

本文探讨了在Java中从JSON字符串中去除多余空格的不同方法。

本文的配套源代码可以在GitHub上找到。