Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从json中删除额外的空格_Java_Json_Parsing - Fatal编程技术网

Java 从json中删除额外的空格

Java 从json中删除额外的空格,java,json,parsing,Java,Json,Parsing,在Java中,我有一个json字符串,我想删除其中多余的空格。我不想删除键和值中字符的空格 实际JSON字符串 { "Error" : "Invalid HTTP Method" , "ErrorCode" : "405" , "ErrorDesc" : "Method Not Allowed" } 必需的JSON {"Error":"Invalid HTTP Method","ErrorCode":"405","ErrorDesc":"Method Not Allowed"} 我会这样说

在Java中,我有一个json字符串,我想删除其中多余的空格。我不想删除键和值中字符的空格

实际JSON字符串

{ "Error" : "Invalid HTTP Method" , "ErrorCode" : "405" , "ErrorDesc" : "Method Not Allowed" } 
必需的JSON

{"Error":"Invalid HTTP Method","ErrorCode":"405","ErrorDesc":"Method Not Allowed"}

我会这样说:

public static void main(String[] args) {
    String json = "{ \"Error\": \"Inv\\\"alid HTTP Method\", \"ErrorCode\":\"405\",\"ErrorDesc\":\"Method Not Allowed\"}";

    System.out.println(removeWhitespaces(json));
}

public static String removeWhitespaces(String json) {

    boolean quoted = false;
    boolean escaped = false;
    String out = "";

    for(Character c : json.toCharArray()) {

        if(escaped) {
            out += c;
            escaped = false;
            continue;
        }

        if(c == '"') {
            quoted = !quoted;
        } else if(c == '\\') {
            escaped = true;
        }

        if(c == ' ' &! quoted) {
            continue;
        }

        out += c;

    }

    return out;

}
测试运行返回

{"Error":"Invalid HTTP Method","ErrorCode":"405","ErrorDesc":"Method Not Allowed"}

我会这样说:

public static void main(String[] args) {
    String json = "{ \"Error\": \"Inv\\\"alid HTTP Method\", \"ErrorCode\":\"405\",\"ErrorDesc\":\"Method Not Allowed\"}";

    System.out.println(removeWhitespaces(json));
}

public static String removeWhitespaces(String json) {

    boolean quoted = false;
    boolean escaped = false;
    String out = "";

    for(Character c : json.toCharArray()) {

        if(escaped) {
            out += c;
            escaped = false;
            continue;
        }

        if(c == '"') {
            quoted = !quoted;
        } else if(c == '\\') {
            escaped = true;
        }

        if(c == ' ' &! quoted) {
            continue;
        }

        out += c;

    }

    return out;

}
测试运行返回

{"Error":"Invalid HTTP Method","ErrorCode":"405","ErrorDesc":"Method Not Allowed"}

如果您使用JsonWriter创建Json代码,您可以这样做

jsonWriter.setIndent("");

要删除使用Gson的json编写器测试的json代码中的所有空白,如果您使用JsonWriter创建json代码,可以执行以下操作

jsonWriter.setIndent("");

要删除使用Gson的json编写器测试的json代码中的所有空格,@Fabian Z所说的可能会起作用,但可以进行优化,您不需要首先将整个字符串转换为字符数组进行迭代,还应该使用StringBuilder:

public static String removeWhitespaces(String json) {
    boolean quoted = false;

    StringBuilder builder = new StringBuilder();

    int len = json.length();
    for (int i = 0; i < len; i++) {
        char c = json.charAt(i);
        if (c == '\"')
            quoted = !quoted;

        if (quoted || !Character.isWhitespace(c))
            builder.append(c);
    }

    return builder.toString();
}

它还将删除换行符。

正如@Fabian Z所说,这可能会起作用,但可以进行优化。您不需要首先将整个字符串转换为字符数组来迭代它,还应该使用StringBuilder:

public static String removeWhitespaces(String json) {
    boolean quoted = false;

    StringBuilder builder = new StringBuilder();

    int len = json.length();
    for (int i = 0; i < len; i++) {
        char c = json.charAt(i);
        if (c == '\"')
            quoted = !quoted;

        if (quoted || !Character.isWhitespace(c))
            builder.append(c);
    }

    return builder.toString();
}

它还将删除换行符

更简单更安全的解决方案是只使用Gson库所需的几行:

public static String simplify(String json) {
    Gson gson = new GsonBuilder().create();

    JsonElement el = JsonParser.parseString(json);
    return gson.toJson(el);
}
您甚至可以使用Gson的“漂亮打印”选项来逆转添加空格的整个过程:

public static String beautify(String json) {
    Gson gson = new GsonBuilder().setPrettyPrinting().create();

    JsonElement el = JsonParser.parseString(json);
    return gson.toJson(el);
}
希望这对你有帮助

您可以从这里获得最新版本:
更简单、更安全的解决方案是仅使用Gson库所需的几行代码:

public static String simplify(String json) {
    Gson gson = new GsonBuilder().create();

    JsonElement el = JsonParser.parseString(json);
    return gson.toJson(el);
}
您甚至可以使用Gson的“漂亮打印”选项来逆转添加空格的整个过程:

public static String beautify(String json) {
    Gson gson = new GsonBuilder().setPrettyPrinting().create();

    JsonElement el = JsonParser.parseString(json);
    return gson.toJson(el);
}
希望这对你有帮助

您可以从这里获得最新版本:
不要忘记转义引号\


不要忘记转义引号\


好的,这可能是我对这篇文章的最后回答:

public static CharSequence removeWhitespaces(CharSequence json) {
    int len = json.length();

    StringBuilder builder = new StringBuilder(len);

    boolean escaped = false, quoted = false;
    for (int i = 0; i < len; i++) {
        char c = json.charAt(i);
        if (c == '\"') {
            if (!escaped) quoted = !quoted;
            else escaped = false;
        } else if (quoted && c == '\\') {
            escaped = true;
        }

        if (quoted || c != ' ') {
            builder.append(c);
        }
    }

    return builder;
}
或者,如果要确保删除了所有空白字符,请使用:

public static CharSequence removeWhitespaces(CharSequence json) {
    int len = json.length();

    StringBuilder builder = new StringBuilder(len);

    boolean escaped = false, quoted = false;
    for (int i = 0; i < len; i++) {
        char c = json.charAt(i);
        if (c == '\"') {
            if (!escaped) quoted = !quoted;
            else escaped = false;
        } else if (quoted && c == '\\') {
            escaped = true;
        }

        if (quoted || !Character.isWhitespace(c)) {
            builder.append(c);
        }
    }

    return builder;
}
这种方法比先将字符串转换为Json结构再转换回字符串要有效得多,因为这样会很耗时

如果输入字符串较长,则提前告知StringBuilder应该具有的启动容量也会大大加快该过程。 容量不等于长度,这意味着即使你告诉StringBuilder它的容量应该是100,它仍然只有你输入文本的长度


由于StringBuilder实现了CharSequence,您可以直接返回整个StringBuilder,而不是将其转换回字符串。但是,如果需要字符串而不是字符序列,只需调用builder.toString;在这个方法的末尾,将返回类型设置为String。

好的,这可能是我对这篇文章的最后回答:

public static CharSequence removeWhitespaces(CharSequence json) {
    int len = json.length();

    StringBuilder builder = new StringBuilder(len);

    boolean escaped = false, quoted = false;
    for (int i = 0; i < len; i++) {
        char c = json.charAt(i);
        if (c == '\"') {
            if (!escaped) quoted = !quoted;
            else escaped = false;
        } else if (quoted && c == '\\') {
            escaped = true;
        }

        if (quoted || c != ' ') {
            builder.append(c);
        }
    }

    return builder;
}
或者,如果要确保删除了所有空白字符,请使用:

public static CharSequence removeWhitespaces(CharSequence json) {
    int len = json.length();

    StringBuilder builder = new StringBuilder(len);

    boolean escaped = false, quoted = false;
    for (int i = 0; i < len; i++) {
        char c = json.charAt(i);
        if (c == '\"') {
            if (!escaped) quoted = !quoted;
            else escaped = false;
        } else if (quoted && c == '\\') {
            escaped = true;
        }

        if (quoted || !Character.isWhitespace(c)) {
            builder.append(c);
        }
    }

    return builder;
}
这种方法比先将字符串转换为Json结构再转换回字符串要有效得多,因为这样会很耗时

如果输入字符串较长,则提前告知StringBuilder应该具有的启动容量也会大大加快该过程。 容量不等于长度,这意味着即使你告诉StringBuilder它的容量应该是100,它仍然只有你输入文本的长度


由于StringBuilder实现了CharSequence,您可以直接返回整个StringBuilder,而不是将其转换回字符串。但是,如果需要字符串而不是字符序列,只需调用builder.toString;在这个方法的末尾,将返回类型设置为String。

为什么?这有什么可能的用途?所以你想缩小它?我想把这个json和另一个json进行比较。但是由于额外的空间,我无法进行比较。无论如何,您不应该在字符串级别进行比较。将字符串作为Java对象读取,并将其与另一个Java对象进行比较。解析这两个JSON并进行比较。避免这种操纵。为什么?这有什么可能的用途?所以你想缩小它?我想把这个json和另一个json进行比较。但是由于额外的空间,我无法进行比较。无论如何,您不应该在字符串级别进行比较。将字符串作为Java对象读取,并将其与另一个Java对象进行比较。解析这两个JSON并进行比较。避免这样的操作。我有一个org.JSONObject,我正在将其转换为字符串。在转换时,我试图删除额外的空格,我有一个org.JSONObject,我正在将其转换为字符串。在转换时,我试图删除多余的空格。请像这样仔细分析字符串,因为如果字符串中嵌入了引号,则会失败,这可能会发生。在JS中,这将创建一个失败案例:让myjsonstr='{Error:Invalid Method,ErrorCode:405,ErrMsg:this\\\ Thing\\ is not allowed}';在Java中,或者从数据库中读取或由用户键入时,也可以轻松创建类似的内容。@StephenP t
鲁,谢谢你指出来。调整answer@StephenP是的,应该为更多的读者指出,无论如何,范围是取代空白。它不会以任何方式解析\t,但也不会丢失,这意味着最终的反序列化程序应该仍然能够正确解析所有内容。我想,像这样解析字符串时要小心,因为如果字符串中嵌入了引号,它将失败,这可能会发生。在JS中,这将创建一个失败案例:让myjsonstr='{Error:Invalid Method,ErrorCode:405,ErrMsg:this\\\ Thing\\ is not allowed}';在Java中,或者从数据库中读取或由用户键入时,也可以轻松创建类似的内容。@StephenP true,感谢您指出这一点。调整answer@StephenP是的,应该为更多的读者指出,无论如何,范围是取代空白。它不会以任何方式解析\t,但也不会丢失,这意味着反序列化程序最终应该仍然能够正确解析所有内容。我猜您是否对此进行过基准测试?我只是好奇,与枚举相比,使用charAti是否/何时会变得更昂贵。不,我没有对此进行基准测试,但如何在字符串上使用枚举?我想即使是JsonParser也会一个接一个地读取字符。你能做的就是告诉StringBuilder它需要的容量。只需在StringBuilder的构造函数中传递它json.length。据我所知,这应该是一个相当有效的实现。你会改变什么使它更快?正如@Andrei Kovrov提到的,你也应该考虑转义引号。但是,您应该在其构造函数中谨慎地告诉StringBuilder/StringBuffer json的长度。您是否曾经对此进行过基准测试?我只是好奇,与枚举相比,使用charAti是否/何时会变得更昂贵。不,我没有对此进行基准测试,但如何在字符串上使用枚举?我想即使是JsonParser也会一个接一个地读取字符。你能做的就是告诉StringBuilder它需要的容量。只需在StringBuilder的构造函数中传递它json.length。据我所知,这应该是一个相当有效的实现。你会改变什么使它更快?正如@Andrei Kovrov提到的,你也应该考虑转义引号。但您应该在其构造函数中谨慎地告诉StringBuilder/StringBuffer json的长度。例如,具有空值的键似乎从输出中过滤出来。这可能是可以接受的,也可能是不可以接受的,但无论如何,答案文本中应该指出这一点!请注意,此解决方案可能会稍微更改数据的内容。例如,具有空值的键似乎从输出中过滤出来。这可能是可以接受的,也可能是不可以接受的,但无论如何,答案文本中应该指出这一点!