【问题标题】:Parse string to JSON将字符串解析为 JSON
【发布时间】:2011-03-14 17:06:28
【问题描述】:

我正在用 org.json 中的库解析这个 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);
} 

日志输出

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

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

【问题讨论】:

    标签: java json loops parsing iterator


    【解决方案1】:

    您在循环体中调用了两次iterator.next()。每次执行此操作时,迭代器都会向前推进。

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

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

    请注意,Iterator&lt;E&gt; 定义了 E next(),因此在这种情况下您不需要转换为 String


    另一个说明性示例

    这是来自Java Language Guide/For-each loop的示例:

    这是人们在尝试嵌套时常犯的错误 迭代两个集合:

    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()));
    

    你能发现错误吗?如果你不能,不要难过。许多专业的程序员 曾经犯过这个错误。问题是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()));
    }
    

    那么这一切与 for-each 构造有什么关系呢?它是为 嵌套迭代!大饱眼福:

    for (Suit suit : suits)
       for (Rank rank : ranks)
           sortedDeck.add(new Card(suit, rank));
    

    如果 JSONObject.keys()Iterable 而不是 Iterator,那么 for-each 是您的最佳解决方案。如果你认为提高可读性是值得的,你可以例如将keys 添加到Collection&lt;String&gt;,即Iterable

    相关问题

    【讨论】:

      猜你喜欢
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多