2017-01-27 1 views
0

Представьте меня гораздо большую версию этого:JSON Java - возможно ли перебирать несколько уровней JSON сразу в поисках определенного значения?

{ 
    "name": "a", 
    "age": 10, 
    "number": 254, 
    "spezial": [{ 
     "name": "vip", 
     "age": 12, 
     "number": 134 
    }, { 
     "name": "b", 
     "age": 56, 
     "number": 934 
    }] 
} 

Теперь все, что я хочу что-то вроде json.containsValue("vip") который возвращает либо верно, если есть значение «вип» somewere, или ложь, если нет.
Я действительно не хочу, чтобы Переберите каждый суб массива индивидуален, мне нужна десять строк кода только для проверки дубликата ...
Спасибо за думать о моей проблеме

+1

Эта библиотека JSON вы используете? – shmosel

+0

Значение может быть сопоставлено любой клавише? – shmosel

+0

Я имею в виду, что вам нужно будет проверить все элементы, чтобы подтвердить, что vip не существует. Нет ничего разумного, что вы можете сделать. –

ответ

0

Этот метод рекурсивного поиска все значения объектов и массива для данной строки:

static boolean findValue(Object node, String value) { 
    if (node instanceof String) { 
     return node.equals(value); 
    } 
    else if (node instanceof JSONArray) { 
     for (Object obj : (JSONArray)node) { 
      if (findValue(obj, value)) { 
       return true; 
      } 
     } 
    } 
    else if (node instanceof JSONObject) { 
     for (Object obj : ((JSONObject)node).values()) { 
      if (findValue(obj, value)) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

Пример использования:

public static void main(String[] args) throws ParseException { 
    Object json = new JSONParser().parse(
      "{" + 
      " \"name\": \"a\"," + 
      " \"age\": 10," + 
      " \"number\": 254," + 
      " \"spezial\": [{" + 
      "  \"name\": \"vip\"," + 
      "  \"age\": 12," + 
      "  \"number\": 134" + 
      " }, {" + 
      "  \"name\": \"b\"," + 
      "  \"age\": 56," + 
      "  \"number\": 934" + 
      " }]" + 
      "}"); 
    System.out.println(findValue(json, "vip")); 
    System.out.println(findValue(json, "foo")); 
} 

Выход:

true 
false 
+0

Прошу прощения, я потрачу время, чтобы полностью проверить это. Но это выглядит просто отлично, спасибо большое! 'instanceof', 'findValue()', отлично звучит, я расскажу о них больше в документации – harlekintiger

+0

@downvoter Что случилось? – shmosel

0

Если значение только String и при условии, что вам требуется только логическое возвращаемое значение, почему вы не пытаетесь String.contains (": \" vip \ "")?

+0

Это означает, что после двоеточия есть ровно одно место. Кроме того, неясно, должны ли считаться значения массива. – shmosel

+0

JSON-File довольно большой, я узнал, что это плохая практика для создания гигантских строк, или это не имеет значения? – harlekintiger

+0

@harlekintiger Как вы собираетесь разбирать JSON без строки? – shmosel

-1

Try код ниже, он должен работать

if(JSON.stringify(dataObject).indexOf('"vip"') != -1){ 
    return true; 
} else { 
return false; 
} 

Примечание: dataObject - это ваш объект JSON.

Поместите это в отдельную функцию, чтобы использовать это как утилиту.

+0

На каком языке это? – shmosel

+0

На самом деле это может быть быстрее, чем другие рекурсивные ответы. Но нужно обрабатывать особые случаи, когда сам ключ называется поисковым термином. Также я не уверен, что «vip» действителен в java. Возможно, вам придется избегать двойных кавычек, таких как «vip». – gipsy

+0

это javascript. Если вам нужно сделать это на Java, вы можете использовать JSON-парсер (Jackson - import this в вашем pom.xml или использовать jar). Создайте объект java, относящийся к вашему json. CustomObject ob = new ObjectMapper().readValue (yourjsonInStringFormat, CustomObject .class); Затем вы можете перебирать список «специальных» объектов. –

Смежные вопросы