2015-07-11 78 views
1

MainActivity.java如何解析JSON数组并在ListView中显示它?

package com.softjourn.redmineclient.activities; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Base64; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import com.google.gson.Gson; 
import com.google.gson.JsonArray; 
import com.google.gson.JsonElement; 
import com.google.gson.JsonParser; 
import com.softjourn.redmineclient.R; 
import com.softjourn.redmineclient.models.Issues; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.ProtocolException; 
import java.net.URL; 
import java.util.ArrayList; 
import butterknife.Bind; 
import butterknife.ButterKnife; 

public class MainActivity extends AppCompatActivity { 

private final static String URI="https://redmineng.softjourn.if.ua/issues.json?assigned_to_id=me"; 
@Bind(R.id.list_issues) ListView mListIssues; 
Login li; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    ButterKnife.bind(this); 

    li = new Login(); 
    li.execute(URI); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

class Login extends AsyncTask<String, Void, String> implements com.softjourn.redmineclient.activities.Login { 

    @Override 
    protected String doInBackground(String... strings) { 
     HttpURLConnection c = null; 
     try { 
      c = (HttpURLConnection) new URL(strings[0]).openConnection(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     c.setUseCaches(false); 
     try { 
      c.setRequestMethod("GET"); 
     } catch (ProtocolException e) { 
      e.printStackTrace(); 
     } 
     c.setRequestProperty("Accept", "application/json"); 
     c.setRequestProperty("Authorization", "basic " + Base64.encodeToString("osavchak:somepassword".getBytes(), 0)); 
     try { 
      c.connect(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     BufferedReader br = null; 
     try { 
      br = new BufferedReader(new InputStreamReader((c.getInputStream()))); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     StringBuilder sb = new StringBuilder(); 
     String output; 
     try { 
      while ((output = br.readLine()) != null) { 
       sb.append(output); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return sb.toString(); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 

     JsonArray ja = new JsonParser().parse(result).getAsJsonObject().getAsJsonArray("issues"); 
     ArrayList<Issues> issues = new ArrayList<Issues>(); 

     for(JsonElement jo : ja) { 
      Issues issue = new Gson().fromJson(jo, Issues.class); 
      issues.add(issue); 
     } 

     ArrayAdapter<Issues> adapter = new ArrayAdapter<Issues>(MainActivity.this, android.R.layout.simple_list_item_1, issues); 
     mListIssues.setAdapter(adapter); 
    } 
} 
} 

Issues.java

package com.softjourn.redmineclient.models; 

import com.google.gson.annotations.SerializedName; 

import java.util.ArrayList; 


public class Issues extends ArrayList<Issues> { 
@SerializedName("id") 
private int id; 

@SerializedName("description") 
private String description; 

public int getId() { 
    return id; 
} 

public String getDescription() { 
    return description; 
} 

public Issues(int id, String description) { 
    this.id = id; 
    this.description = description; 
} 

@Override 
public String toString() { 
    return "[" + this.id + "] " + this.description; 
} 
} 

JSON响应的样子:

{"issues":[{"id":11023,"project":{"id":52,"name":"Our Vacations and Days Off"},"tracker":{"id":10,"name":"Day Off"},"status":{"id":12,"name":"Accepted"},"priority":{"id":1,"name":"Normal"},"author":{"id":186,"name":"Savchak Orest"},"assigned_to":{"id":186,"name":"Savchak Orest"},"subject":"Orest Savchak","description":"","start_date":"2015-06-08","due_date":"2015-06-08","done_ratio":0,"created_on":"2015-06-04T19:12:14Z","updated_on":"2015-06-05T08:43:35Z"},{"id":10994,"project":{"id":52,"name":"Our Vacations and Days Off"},"tracker":{"id":12,"name":"Medical"},"status":{"id":12,"name":"Accepted"},"priority":{"id":1,"name":"Normal"},"author":{"id":186,"name":"Savchak Orest"},"assigned_to":{"id":186,"name":"Savchak Orest"},"subject":"Orest Savchak","description":"","start_date":"2015-06-03","due_date":"2015-06-03","done_ratio":0,"created_on":"2015-06-03T07:19:01Z","updated_on":"2015-06-03T08:09:21Z"},{"id":10651,"project":{"id":52,"name":"Our Vacations and Days Off"},"tracker":{"id":11,"name":"Business Trip"},"status":{"id":12,"name":"Accepted"},"priority":{"id":1,"name":"Normal"},"author":{"id":186,"name":"Savchak Orest"},"assigned_to":{"id":186,"name":"Savchak Orest"},"subject":"Orest Savchak","description":"U.S. visa development.","start_date":"2015-04-20","due_date":"2015-04-20","done_ratio":0,"created_on":"2015-04-09T15:58:38Z","updated_on":"2015-04-10T07:39:38Z"},{"id":10555,"project":{"id":52,"name":"Our Vacations and Days Off"},"tracker":{"id":10,"name":"Day Off"},"status":{"id":12,"name":"Accepted"},"priority":{"id":1,"name":"Normal"},"author":{"id":186,"name":"Savchak Orest"},"assigned_to":{"id":186,"name":"Savchak Orest"},"subject":"Orest Savchak","description":"","start_date":"2015-05-05","due_date":"2015-05-05","done_ratio":0,"created_on":"2015-04-03T10:24:11Z","updated_on":"2015-04-08T08:18:13Z"},{"id":10554,"project":{"id":52,"name":"Our Vacations and Days Off"},"tracker":{"id":10,"name":"Day Off"},"status":{"id":12,"name":"Accepted"},"priority":{"id":1,"name":"Normal"},"author":{"id":186,"name":"Savchak Orest"},"assigned_to":{"id":186,"name":"Savchak Orest"},"subject":"Orest Savchak","description":"","start_date":"2015-04-30","due_date":"2015-04-30","done_ratio":0,"created_on":"2015-04-03T10:19:40Z","updated_on":"2015-04-08T08:18:12Z"},{"id":10219,"project":{"id":52,"name":"Our Vacations and Days Off"},"tracker":{"id":10,"name":"Day Off"},"status":{"id":12,"name":"Accepted"},"priority":{"id":1,"name":"Normal"},"author":{"id":186,"name":"Savchak Orest"},"assigned_to":{"id":186,"name":"Savchak Orest"},"subject":"Orest Savchak","description":"Czech visa development","start_date":"2015-03-23","due_date":"2015-03-23","done_ratio":0,"created_on":"2015-03-06T08:59:47Z","updated_on":"2015-04-06T09:20:55Z"},{"id":10199,"project":{"id":52,"name":"Our Vacations and Days Off"},"tracker":{"id":12,"name":"Medical"},"status":{"id":12,"name":"Accepted"},"priority":{"id":1,"name":"Normal"},"author":{"id":186,"name":"Savchak Orest"},"assigned_to":{"id":186,"name":"Savchak Orest"},"subject":"Orest Savchak","description":"","start_date":"2015-03-04","due_date":"2015-03-04","done_ratio":0,"created_on":"2015-03-03T17:35:48Z","updated_on":"2015-03-04T09:27:02Z"},{"id":10183,"project":{"id":52,"name":"Our Vacations and Days Off"},"tracker":{"id":12,"name":"Medical"},"status":{"id":12,"name":"Accepted"},"priority":{"id":1,"name":"Normal"},"author":{"id":186,"name":"Savchak Orest"},"assigned_to":{"id":186,"name":"Savchak Orest"},"subject":"Orest Savchak","description":"","start_date":"2015-03-03","due_date":"2015-03-03","done_ratio":0,"created_on":"2015-03-02T14:27:40Z","updated_on":"2015-03-02T14:34:57Z"},{"id":9791,"project":{"id":52,"name":"Our Vacations and Days Off"},"tracker":{"id":10,"name":"Day Off"},"status":{"id":12,"name":"Accepted"},"priority":{"id":1,"name":"Normal"},"author":{"id":186,"name":"Savchak Orest"},"assigned_to":{"id":186,"name":"Savchak Orest"},"subject":"Orest Savchak","description":"","start_date":"2015-01-09","due_date":"2015-01-09","done_ratio":0,"created_on":"2015-01-06T14:09:14Z","updated_on":"2015-01-08T11:54:55Z"},{"id":9128,"project":{"id":52,"name":"Our Vacations and Days Off"},"tracker":{"id":9,"name":"Vacation"},"status":{"id":12,"name":"Accepted"},"priority":{"id":1,"name":"Normal"},"author":{"id":186,"name":"Savchak Orest"},"assigned_to":{"id":186,"name":"Savchak Orest"},"subject":"Orest Savchak","description":"Vacation","start_date":"2014-11-03","due_date":"2014-11-14","done_ratio":0,"created_on":"2014-10-15T12:28:33Z","updated_on":"2014-10-16T09:17:31Z"},{"id":7921,"project":{"id":52,"name":"Our Vacations and Days Off"},"tracker":{"id":9,"name":"Vacation"},"status":{"id":12,"name":"Accepted"},"priority":{"id":1,"name":"Normal"},"author":{"id":186,"name":"Savchak Orest"},"assigned_to":{"id":186,"name":"Savchak Orest"},"subject":"Orest Savchak","description":"Vacation for two weeks","start_date":"2014-08-11","due_date":"2014-08-21","done_ratio":0,"created_on":"2014-06-03T14:04:15Z","updated_on":"2014-06-05T10:01:23Z"},{"id":7698,"project":{"id":52,"name":"Our Vacations and Days Off"},"tracker":{"id":12,"name":"Medical"},"status":{"id":12,"name":"Accepted"},"priority":{"id":1,"name":"Normal"},"author":{"id":186,"name":"Savchak Orest"},"assigned_to":{"id":186,"name":"Savchak Orest"},"subject":"Orest Savchak","description":"Medical on Monday","start_date":"2014-05-12","due_date":"2014-05-12","done_ratio":0,"created_on":"2014-05-11T10:18:58Z","updated_on":"2014-05-13T08:21:08Z"},{"id":7337,"project":{"id":52,"name":"Our Vacations and Days Off"},"tracker":{"id":10,"name":"Day Off"},"status":{"id":12,"name":"Accepted"},"priority":{"id":1,"name":"Normal"},"author":{"id":186,"name":"Savchak Orest"},"assigned_to":{"id":186,"name":"Savchak Orest"},"subject":"Orest Savchak","description":"","start_date":"2014-02-27","due_date":"2014-02-28","done_ratio":0,"created_on":"2014-02-11T12:34:16Z","updated_on":"2014-02-17T15:15:30Z"},{"id":6823,"project":{"id":138,"name":"Orest Savchak tasks"},"tracker":{"id":2,"name":"User Story"},"status":{"id":1,"name":"New"},"priority":{"id":1,"name":"Normal"},"author":{"id":42,"name":"Vershynin Yevgeniy"},"assigned_to":{"id":186,"name":"Savchak Orest"},"subject":"Authomatization testing","description":"Testing for IMAX Android app.","start_date":"2013-12-04","done_ratio":0,"created_on":"2013-12-04T16:16:16Z","updated_on":"2014-01-21T16:29:49Z","story_points":null}],"total_count":14,"offset":0,"limit":25} 

当我跑我的应用程序将其与“COM崩溃.google.gson.JsonSyntaxException:java.lang.IllegalStateException:E xpected BEGIN_ARRAY但是BEGIN_OBJECT'

我该如何解决它?

+0

[,那么你应该使用getJSONArray()方法。就好像节点以{开始,那么你应该使用getJSONObject()方法。 –

回答

1

问题是你告诉Gson你有一个你的类型的对象,实际上你有一个类型的对象数组。

尝试,而不是这样:它是一个JSON对象contaning jsonarray.If您的JSON节点开头

Type collectionType = new TypeToken < List<Issues>>(){}.getType(); 

List<Issues> issues = (List<Issues>) new Gson().fromJson(json_response, collectionType);