Нахождение глубины JSON строки в JAVA - PullRequest
0 голосов
/ 08 апреля 2020

Мне дали строку в методе java, и я должен вернуть глубину сына этой строки

, как если бы метод был

find depthJSON(String s){
     //code
     return count;
}

, например:

{
    "0" : { "name" : "John", "City" : "NY"},
    "1" : { "name" : "Mike", "City" : "LA"}
}

для этого входа, глубина 2

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Ваша проблема требует токенизатора JSON. На самом деле вам не нужно анализировать ваш файл (ie. Построить некоторую древовидную структуру как объект Java), поскольку вас интересует только максимальная глубина вложения, которая может быть получена из одного потока токенов. .

Основная идея c состоит в том, чтобы отслеживать вкладки токенов, которые представляют начало и конец объекта ({, }). Всякий раз, когда токенизатор видит начало / конец объекта, увеличивает / уменьшает глобальный счетчик глубины; Всякий раз, когда токенизатор видит конец объекта, проверьте, больше ли текущий глобальный счетчик глубины, чем максимальный, наблюдаемый до сих пор, и измените значение соответствующим образом.

В качестве пакета для поставки sh JSON Tokenizer, I предложил бы Джексон . Загрузите файлы JAR в исходный каталог (или в подходящее место в каталоге инструментов разработки). Файлы jar доступны по адресу:

 https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.10.3/jackson-core-2.10.3.jar
 https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar
 https://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.10.3/jackson-databind-2.10.3.jar

Обратите внимание, что вам нужны все из них, и не забудьте изменить Java CLASSPATH, если ваша IDE не позаботится об этом.

Код

Следующий класс определяет и печатает глубину вашего json:

Протестировано с Java SE 11, u 28 .

Примечание (синтаксис JSON)

Обратите внимание, что ваш пример файла НЕ действителен JSON - некоторые имена свойств не включены в двойных кавычках свойства не разделяются запятыми. Исправленная версия приходит сюда:

{
    "0" : { "name" : "John", "City" : "NY"}
  , "1" : { "name" : "Mike", "City" : "LA"}
}
0 голосов
/ 08 апреля 2020

мой ответ

    int JsonDepth (String S) { 
        int current_max = 0; 
        int max = 0; 
        int n = S.length(); 

        for (int i = 0; i < n; i++) { 
            if (S.charAt(i) == '{') { 
                current_max++; 

                // update max if required 
                if (current_max > max) { 
                    max = current_max; 
                } 
            } else if (S.charAt(i) == '}') { 
                if (current_max > 0) { 
                    current_max--; 
                } else { 
                    return -1; 
                } 
            } 
        } 

        if (current_max != 0) { 
            return -1; 
        } 

        return max; 
    } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...