将字符串解析为JSON

bl4*_*4d3 1 java parsing json iterator loops

我正在用org.json中的lib解析这个JSON字符串,我无法理解为什么我将下面的输出放到日志中.

ArrayList<String> al = new ArrayList<String>();
JSONObject demo = new JSONObject("{\"00408C88A2E6\":{\"id\":\"00408C88A2E6\",\"name\":\"Lab\"},\"00408C91188B\":{\"id\":\"00408C91188B\",\"name\":\"Lab1\"},\"00408C944B99\":{\"id\":\"00408C944B99\",\"name\":\"Lato1\"},\"00408C944BA0\":{\"id\":\"00408C944BA0\",\"name\":\"Lato\"}}");
Iterator<String> iterator =  demo.keys();
while (iterator.hasNext() ){    
  al.add((String)iterator.next());
  Log.i(LOG_TAG, "size al into while " + al.size());
  Log.i(LOG_TAG, "MAC " + iterator.next() + " for the user " + userId);
} 
Run Code Online (Sandbox Code Playgroud)

记录输出

07-12 08:55:34.056: INFO/parse(285): size al into while 1
07-12 08:55:34.056: INFO/parse(285): MAC 00408C91188B for the user nweb
07-12 08:55:34.066: INFO/parse(285): size al into while 2
07-12 08:55:34.066: INFO/parse(285): MAC 00408C944B99 for the user nweb
07-12 08:55:34.066: INFO/parse(285): size al 2
Run Code Online (Sandbox Code Playgroud)

我的ArrayList中不应该有4个元素?谢谢

pol*_*nts 5

iterator.next()在循环体中调用了两次.每次执行时,迭代器都会前进.

您可能希望在正文中调用它一次并将其存储在局部变量中.

String next = iterator.next();
al.add(next);
Log.i(LOG_TAG, "MAC " + next + " for the user " + userId);
Run Code Online (Sandbox Code Playgroud)

请注意Iterator<E>定义E next(),因此String在这种情况下您不需要强制转换.


另一个例子

以下是Java语言指南/ For-each循环的示例:

以下是人们在尝试对两个集合进行嵌套迭代时常犯的错误:

List suits = ...;
List ranks = ...;
List sortedDeck = new ArrayList();

// BROKEN - throws NoSuchElementException!
for (Iterator i = suits.iterator(); i.hasNext(); )
    for (Iterator j = ranks.iterator(); j.hasNext(); )
        sortedDeck.add(new Card(i.next(), j.next()));
Run Code Online (Sandbox Code Playgroud)

你能发现这个bug吗?如果你不能,不要感到难过.许多专家程序员在某个时候犯过这个错误.问题是该next 方法在"外部"集合(诉讼)上被调用了太多次.它在外部和内部集合的内部循环中被调用,这是错误的.为了解决这个问题,你必须在外部循环的范围内添加一个变量来保存套装:

// Fixed, though a bit ugly
for (Iterator i = suits.iterator(); i.hasNext(); ) {
    Suit suit = (Suit) i.next();
    for (Iterator j = ranks.iterator(); j.hasNext(); )
        sortedDeck.add(new Card(suit, j.next()));
}
Run Code Online (Sandbox Code Playgroud)

那么所有这些与for-each构造有什么关系呢?它是为嵌套迭代量身定做的!视觉盛宴:

for (Suit suit : suits)
   for (Rank rank : ranks)
       sortedDeck.add(new Card(suit, rank));
Run Code Online (Sandbox Code Playgroud)

曾经JSONObject.keys()是一个Iterable代替Iterator,那么,每一个你的情况最好的解决方案.如果您认为可读性的提高是值得的,您可以将其添加keys到a中Collection<String>,这是一个Iterable.

相关问题