Java 从json中删除额外的空格
在Java中,我有一个json字符串,我想删除其中多余的空格。我不想删除键和值中字符的空格 实际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"} 我会这样说
{ "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的长度。例如,具有空值的键似乎从输出中过滤出来。这可能是可以接受的,也可能是不可以接受的,但无论如何,答案文本中应该指出这一点!请注意,此解决方案可能会稍微更改数据的内容。例如,具有空值的键似乎从输出中过滤出来。这可能是可以接受的,也可能是不可以接受的,但无论如何,答案文本中应该指出这一点!