Удалите лишние пробелы из json - PullRequest
0 голосов
/ 02 мая 2020

В Java У меня есть строка json, и я хочу удалить из нее лишние пробелы. Я не хочу удалять пробел из символа в ключах и значениях.

Фактический JSON Строка

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

Требуется JSON

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

Ответы [ 5 ]

1 голос
/ 02 мая 2020

То, что сказал @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();
}

Также при использовании

Character.isWhitespace(c)

это также удалит разрывы строк

1 голос
/ 02 мая 2020

Я бы go с чем-то вроде этого:

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;

}

Testrun возвращает

{"Error":"Invalid HTTP Method","ErrorCode":"405","ErrorDesc":"Method Not Allowed"}
0 голосов
/ 02 мая 2020

Не забывайте об экранированных кавычках \"!

static String minimize(String input){
     StringBuffer strBuffer = new StringBuffer();    
     boolean qouteOpened = false;
     boolean wasEscaped = false;
     for(int i=0; i<input.length(); i++){
         char c = input.charAt(i);
         if (c == '\\') {
            wasEscaped = true;
         }
         if(c == '"') {
             qouteOpened = wasEscaped ? qouteOpened : !qouteOpened;
         }
         if(!qouteOpened && (c == ' ')){
             continue;
         }
         if (c != '\\') {
            wasEscaped = false;
         }
         strBuffer.append(c);
     }
     return strBuffer.toString();
}
0 голосов
/ 02 мая 2020

Еще более простым и безопасным решением было бы использование библиотеки 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 Maven

0 голосов
/ 02 мая 2020

Если вы используете JsonWriter для создания этого кода Json, вы можете

jsonWriter.setIndent("");

удалить все пробелы в коде json (протестировано с помощью Json Writer Gson)

...