2017-07-25 35 views
1

它的json文件讀與GSON

{"VisitorsList":[{"VisitorID":"09005451","VisitorName":" xxxx","VisitorPhon":"","VisitorAddr":"xxxx","GeoCode":"","AutoKey":1},{"VisitorID":"09005468","VisitorName":"xxxxxx","VisitorPhon":"09005468","VisitorAddr":"xxxx","GeoCode":"","AutoKey":2}]} 

Android和我想讀取並顯示從該文件信息到ListView

我VisitorsListActivity是:

public class VisitorsListActivity extends AppCompatActivity { 

public ListView lstVisitors; 
static VisitorsList visitorsList; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.visitor_list); 

    try { 

     //********************************** COMELETE THIS SECTION ********************************************* 

     new JsonHelper.GetJsonData(new JsonHelper.GetJsonData.AsyncResponse() { 

      @Override 
      public void processFinish(String output) { 
       try { 
        if (output == null) output = ""; 
        if (output.equals("")) { 
         Toast.makeText(getApplicationContext(), 
           "No Visitor Founded", 
           Toast.LENGTH_LONG) 
           .show(); 
         return; 
        } 
        //960105-------------------- 
        else if (output.equals("401")) { 
         Toast.makeText(getApplicationContext(), 
           "Error 401", 
           Toast.LENGTH_LONG) 
           .show(); 
         return; 
        } 
        //-------------------------------------- 

        Log.i("LOG", "output" + output); 
        Gson gson = new Gson(); 
        output = output.substring(1, output.length() - 1); 

        /*Toast.makeText(getApplicationContext(), 
          output, 
          Toast.LENGTH_LONG) 
          .show();*/ 

        visitorsList = new VisitorsList(); 
        visitorsList = gson.fromJson(output, VisitorsList.class); 

       } catch (Exception e) { 
        e.printStackTrace(); 

        Toast.makeText(getApplicationContext(), 
          "exception", 
          Toast.LENGTH_LONG) 
          .show(); 
       } 
      } 
     }).execute("http://192.168.1.162:8014/api/Visitors"); 


     //************************************ visitor list is null :| ******************************************* 


     /*if(visitorsList == null) { 
      Toast.makeText(getApplicationContext(), 
        "data is nul", 
        Toast.LENGTH_LONG) 
        .show(); 
     }*/ 

     AdapterVisitor customAdapter = new AdapterVisitor(this, R.layout.visitor_list, visitorsList.VisitorsList); 
     customAdapter.notifyDataSetChanged(); 
     lstVisitors.setAdapter(customAdapter); 

     lstVisitors.requestFocus(); 

     final ViewGroup layoutClear = (ViewGroup) findViewById(R.id.layoutClear); 
     layoutClear.setVisibility(View.GONE); 

    } catch (Exception e) { 
     e.getMessage(); 
    } 

} } 

and VisitorsList:

public class VisitorsList { 

public VisitorsList() {} 

public ArrayList<Visitors> VisitorsList;} 

訪問者:它通過創建GSON

public class Visitors { 
public String VisitorID; 
public String VisitorName; 
public String VisitorPhon; 
public String VisitorAddr; 
public String GeoCode; 
public int AutoKey;} 

始終訪客列表爲空。我不知道也許我的問題是從JSON或也許遊客類閱讀...

jsonhelper:

public class JsonHelper { 

public static class GetJsonData extends AsyncTask<String, Void, String> { 

    public interface AsyncResponse { 

     void processFinish(String output); 
    } 

    public AsyncResponse delegate = null; 


    public GetJsonData(AsyncResponse delegate) { 
     this.delegate = delegate; 
    } 


    @Override 
    protected String doInBackground(String... strUrl) { 

     String str = strUrl[0]; 
     URLConnection urlConn = null; 
     BufferedReader bufferedReader = null; 
     try { 
      URL url = new URL(str); 
      urlConn = url.openConnection(); 
      urlConn.setReadTimeout(300000); 
      urlConn.setConnectTimeout(5000); 

      bufferedReader = new BufferedReader(new InputStreamReader(urlConn.getInputStream(), "utf-8"), 8); 

      StringBuffer stringBuffer = new StringBuffer(); 
      String line; 
      while ((line = bufferedReader.readLine()) != null) { 
       stringBuffer.append(line); 
      } 
      String tmpJson = stringBuffer.toString().replace("\\", ""); 

      return tmpJson; 
     } catch (Exception ex) { 
      ex.getMessage(); 

      return null; 
     } finally { 
      if (bufferedReader != null) { 
       try { 
        bufferedReader.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 

       } 
      } 
     } 
    } 


    @Override 
    protected void onPostExecute(String response) { 
     delegate.processFinish(response); 
    } 
} 


public static class SetJsonData extends AsyncTask<String, Void, String> { 

    String responseServer; 


    public interface AsyncResponse { 

     void processFinish(String output); 
    } 

    public AsyncResponse delegate = null; 


    public SetJsonData(AsyncResponse delegate) { 
     this.delegate = delegate; 
    } 


    @Override 
    protected String doInBackground(String... param) { 
     URL url; 
     String response = null; 
     try { 

      url = new URL(param[0]); 
      HttpURLConnection conn = null; 
      conn = (HttpURLConnection) url.openConnection(); 
      conn.setReadTimeout(20000); 
      conn.setConnectTimeout(10000);//950718 
      conn.setRequestMethod("GET"); 
      conn.setDoInput(true); 
      conn.setDoOutput(true); 
      OutputStream os = conn.getOutputStream(); 
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); 
      writer.write(param[1]); 
      writer.flush(); 
      writer.close(); 
      os.close(); 
      int responseCode = conn.getResponseCode(); 
      if (responseCode == HttpsURLConnection.HTTP_OK) { 
       String line; 
       BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
       while ((line = br.readLine()) != null) { 
        response += line; 
       } 
      } else { 
       response = (String.valueOf(responseCode)); 
       String line; 
       BufferedReader br = new BufferedReader(new InputStreamReader(conn.getErrorStream()));//950427 
       while ((line = br.readLine()) != null) { 
       } 

      } 
      return response; 
     } catch (IOException e1) { 
      e1.getMessage(); 

      return null; 
     } catch (Exception e) { 
      e.getMessage(); 
      return null; 
     } 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     try { 
      super.onPostExecute(result); 
      delegate.processFinish(result); 
     } catch (Exception e) { 
      e.getMessage(); 
     } 
    } 

}} 
+0

您是否得到任何異常?這行代碼是什麼output = output.substring(1,output.length() - 1);做? – maphongba008

+0

如果訪問者列表爲空,這意味着你最終在一個異常,因爲這個代碼'visitorList = new VisitorsList();'從來沒有跑 – Ricardo

回答

0

我改變VisitorsListActivity下同。並設置一個條件,然後調用適配器,以確保從json讀取信息已完成,此工作正常:

new JsonHelper.GetJsonData(new JsonHelper.GetJsonData.AsyncResponse() { 

     @Override 
     public void processFinish(String output) { 
      try { 
       if (output == null) output = ""; 
       if (output.equals("")) { 
        Toast.makeText(getApplicationContext(), 
          "No Visitor Founded", 
          Toast.LENGTH_LONG) 
          .show(); 
        return; 
       } 

       else if (output.equals("401")) { 
        Toast.makeText(getApplicationContext(), 
          "Error 401", 
          Toast.LENGTH_LONG) 
          .show(); 
        return; 
       } 

       Log.i("LOG", "output" + output); 
       Gson gson = new Gson(); 
       output = output.substring(1, output.length() - 1); 


       try { 
        visitorsList = new VisitorsList(); 
        visitorsList = gson.fromJson(output, VisitorsList.class); 
        if(visitorsList != null) { 
         d.cancel(); 
         adapter = new AdapterVisitor(visitorsList.VisitorsList); 
         adapter.notifyDataSetChanged(); 
         lstVisitors.setAdapter(adapter); 

         lstVisitors.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
          public void onItemClick(AdapterView<?> parent, View view, 
                int position, long id) { 
           // ****** 
           Object o = lstVisitors.getItemAtPosition(position); 
           Intent i = new Intent(getApplicationContext(),DateSelectorActivity.class); 
           Visitors v = (Visitors) o; 
           i.putExtra("VisitorID", v.VisitorID); 
           startActivity(i); 
          } 
         }); 
        } 

       }catch (Exception e) { 
        Log.i("LOG", getAssets().toString() + "exception" + e); 
       } 


      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

    }).execute(url); 
0

那麼第一次讀AsyncResponse所以你用的是異步請求是幹什麼的? 異步請求不會阻止客戶端,因此它在響應返回時繼續執行代碼,它將執行回調中的內容。 但你打電話customAdapter.notifyDataSetChanged();以外processFinish()你需要打電話給裏面或打電話Adapter裏面的processFinish方法。

+0

你幾乎是正確的,但我現在的問題是,visitorList是null:visitorsList = gson。fromJson(output,VisitorsList.class);返回null -.- –

+0

在那一點上,我不知道,爲您的JsonHelper添加更多的代碼 –

+0

我添加jsonhelper到第一篇文章 –

0

公共類VisitorsList {

公共VisitorsList(){}

公共ArrayList的VisitorsList =新的ArrayList <>();}

應該是這樣...... Intialization丟失。

0

VisitorsList類:

public class VisitorsList { 


     @SerializedName("VisitorsList") 
     public List<VisitorsList> VisitorsList; 

     public static class VisitorsList { 
      @SerializedName("VisitorID") 
      public String VisitorID; 
      @SerializedName("VisitorName") 
      public String VisitorName; 
      @SerializedName("VisitorPhon") 
      public String VisitorPhon; 
      @SerializedName("VisitorAddr") 
      public String VisitorAddr; 
      @SerializedName("GeoCode") 
      public String GeoCode; 
      @SerializedName("AutoKey") 
      public int AutoKey; 
     } 
    } 

刪除這一行

output = output.substring(1, output.length() - 1); 

,並得到你的結果:

Gson gson = new Gson(); 
visitorsList=gson.fromJson(output), new TypeToken<VisitorsList>() { }.getType());