2013-02-25 2 views
-1

У меня есть экземпляр JSONArray, и мне было просто любопытно, могу ли я использовать каждую конструкцию для работы с каждым элементом в последовательности. Поэтому я пробовал:Должен ли я использовать Java для каждого с типом Object?

for(Object jsonObj: jsonArray) { 
    System.out.println("JSONArray element: '" + ((JSONObject)jsonObj).toString() + "'"); 
} 

К моему удивлению, это сработало. Я думал, что мне нужно будет работать с классами, которые реализуют Iterable.

Итак, если вы можете ответить на мой первоначальный вопрос (используя для каждого на JSONArray), это здорово. Также:

  • 2-й вопрос: Почему он работает?
  • 3-й вопрос: Должен ли я быть лишен фактического использования этого кода доставки?

Спасибо всем!

+4

JsonArray * is * итерируемый. Тот факт, что вы неявно бросаете каждый элемент, возвращенный итератором на 'Object', действительно не имеет никакого отношения. И * почему бы вам это сделать, был бы вопрос, который я задал бы ... –

+0

@BrianRoach, где он говорит это в документах? –

+2

@Christian - Какие документы? * Он компилируется *, поэтому он реализует 'Iterable'. –

ответ

0

Как вы знаете, для каждой петли only works for Iterables and arrays.

Оригинальная реализация json.org JSONArray doesn't implement iterable, но Gson implementation does, как указано @Quirim и @BrianRoach.

В версии json.org был intend to implement it, но в конце концов они этого не сделали.

Так, чтобы ответить на ваши вопросы 3:

  1. Вы должны быть с помощью Gson или аналогичной реализации JsonArray, который реализует Iterable.
  2. Потому что JsonArray is Iterable.
  3. Нет, не следует.
+0

[JsonArray] (http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/JsonArray.html) Эта реализация показывает, что она итерабельна. Я не знаю, что эта реализация актуальна сейчас, или это другая, которая используется. – Quirin

+0

Это JsonArray из Gson? Я взял реализацию json.org. –

+2

Я действительно не знаю, что он использует. Древний crufty 'org.json.JSONArray' не повторяется в любой версии, о которой я знаю, но я бы не использовал ее в любом случае. PR, который вы цитируете, парень закрыл его без слияния, говоря, что он этого не хочет, поэтому он все еще совместим с 1.4. Что бы он ни использовал, он должен реализовать «Итерабель» или просто не компилируется. –

0

The for-each loop синтаксис был введен в java 1.5. Цель состоит в том, чтобы очистить ваш код от очевидных вещей, таких как итераторы, а также отключить некоторые возможности ошибки.

Этот вид оператора цикла работает только на классах Iterable, чтобы ответить на ваш вопрос, потому что JsonArray реализует интерфейс Iterable.

Что касается вашего кода, я думаю, что он также работает, если вы точно знаете, что jsonObj - это тип JSONObject, и это не только Object. Таким образом, вы можете эллимировать отклонение от типа ошибки, исходящее из тела вашего цикла.

+0

Но я не могу, сэр. JSONArrays не содержат JSONObjects, они содержат объекты. Чтобы быть уверенным, я попробовал еще раз.Изменение объекта к результатам JSONObject в: ** Тип несоответствия: не удается преобразовать из типа элемента объекта в JSONObject ** И я не вижу ничего в классе JSONArray в реализации Iterable: [ссылка] (HTTP: // www.json.org/javadoc/org/json/JSONArray.html) –

+0

@ user2100752 - У нас нет ESP, мы понятия не имеем, какую библиотеку вы используете. Как бы то ни было, это не то, к чему вы ссылаетесь выше, или ваш код * не будет компилировать * никогда не запускайте. –

+0

@Brian: Вы должны пересмотреть ESP, это действительно сделает вещи более эффективными. ;) Кроме того, в этом проекте я унаследовал, я предположил, что это стандартная библиотека JSON, моя неудача. Вопрос ответил. Благодарю. –

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