将Iterator从JSONObject重写为JSONArray

时间:2016-01-20 10:22:43

标签: java json

我有一个JSONObjects的迭代器但不幸的是我从我的JSON数据中获得了JSONArray

现在我要改写它。我对Java很陌生。有人能告诉我如何处理这个问题吗?

我使用json.simple库。

public class JSONIteratorAuthor implements Iterator <Author> {

   private Iterator<JSONObject> authors;

   public JSONIteratorAuthor(JSONObject jsonObject){

       this.authors = ((JSONArray) jsonObject.get("authors")).iterator();
   }

   @Override
   public boolean hasNext() {
       return this.authors.hasNext();
   }

   public Author next() {
       if(this.hasNext()){
           Author a = new Author(0, "", "");
           JSONObject authorNode = (JSONObject) authors.next();
           a.setFirstName((String) authorNode.get("first_name"));
           a.setLastName((String) authorNode.get("last_name"));
           return a;
       }
       else {
       return null;
       }
   }    
}

1 个答案:

答案 0 :(得分:0)

由于缺乏有关JSON数据结构的信息,我假设如下:

  1. 你有一个JSONArray对象用
  2. 来调用构造函数
  3. JSONArray包含JSONObject s
  4. 这些JSONObject已获得合适的键值对
  5. 在这种情况下,以下解决方案应该有效。它利用了JSONArray本身可迭代的事实。

    private Iterator<JSONObject> authors;
    
    @SuppressWarnings("unchecked")
    public JSONIteratorAuthor(JSONArray array){
       authors = array.iterator();
    }
    
    @Override
    public boolean hasNext() {
       return authors.hasNext();
    }
    
    @Override
    public Author next() {
       if (hasNext()) {
           Author a = new Author(0, "", "");
           JSONObject authorNode = authors.next();
           a.setFirstName((String) authorNode.get("first_name"));
           a.setLastName((String) authorNode.get("last_name"));
           return a;
       }
       else {
           return null;
       }
    }
    

    编辑:鉴于您的实际输入,解决方案很简单:数组包含对象,其中包含其他数组。因此,要使上述代码起作用,您必须执行以下操作(其中parsedJson是您从实际输入文件中获得的内容(在dropbox中发布):

    Iterator array = ((JSONArray) parsedJson).iterator();           
    while (array.hasNext()) {
        JSONObject json = (JSONObject) array.next();
        JSONArray authors = (JSONArray)json.get("authors");
        JSONIteratorAuthor test = new JSONIteratorAuthor(authors);
        while (test.hasNext()) {
            System.out.println(test.next());
        }
    }