2017-03-02 58 views
0

我試圖把json放入recyclerview,但它給了我「無法解析dara」錯誤!無法解析數據到recyclerview

這是我的JSON響應:

{ 「行動」: 「真」, 「錯誤」: 「」, 「數據」:[{ 「_ ID」: 「58ad8d8ca49d0e11e21c4504」, 「STORE_NAME」: 「firstStore」, 「store_view」:0, 「store_textposition」:空}]}

還有就是我得到的錯誤 「Shops_parser.java」:

public class Shops_Parser extends AsyncTask<Void,Void,Boolean> { 
    Context c; 
    String jsonData; 
    RecyclerView rv; 
    ProgressDialog pd; 
    ArrayList<String> shops = new ArrayList<>(); 

    public Shops_Parser(Context c, String jsonData, RecyclerView rv) { 
     this.c = c; 
     this.jsonData = jsonData; 
     this.rv = rv; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pd=new ProgressDialog(c); 
     pd.setMessage("PARSING JSON"); 
     pd.show(); 
    } 

    @Override 
    protected Boolean doInBackground(Void... voids) { 
     return parse(); 
    } 

    @Override 
    protected void onPostExecute(Boolean isParsed) { 
     super.onPostExecute(isParsed); 
     pd.dismiss(); 
     if(isParsed) 
     { 
      ShopsAdapter adapter = new ShopsAdapter(c,shops); 
      rv.setAdapter(adapter); 
     } 
     else 
     { 
      Toast.makeText(c,"Unable to Parse data",Toast.LENGTH_SHORT).show(); 
     } 
    } 

    private boolean parse() 
    { 
     try 
     { 
      JSONArray ja = new JSONArray(jsonData); 
      JSONObject jo; 
      shops.clear(); 
      for(int i=0;i<ja.length();i++) 
      { 
       jo=ja.getJSONObject(i); 
       String store_name = jo.getString("store_name"); 
       shops.add(store_name); 
      } 
      return true; 
     } 
     catch (JSONException e) 
     { 
      e.printStackTrace(); 
      return false; 
     } 
    } 
} 

這有什麼錯它?

+1

你**不需要**的的AsyncTask解析JSON字符串 –

+0

你確實需要一個更大的對象@ cricket_007 – peter

+0

@peter也許,但問題沒有一個 –

回答

2

你的根元素是一個json對象。首先解析對象然後獲取json數組

try 
    { 
     JSONObject obj = new JSONObject(jsonData); 
     JSONArray ja = obj.getJsonArray("data"); 
     JSONObject jo; 
     shops.clear(); 
     for(int i=0;i<ja.length();i++) 
     //................ 
0

起初讀取您的JSON

{ 「行動」: 「真」, 「錯誤」: 「」, 「數據」:[{ 「_ ID」: 「58ad8d8ca49d0e11e21c4504」, 「STORE_NAME」: 「firstStore」, 「store_view」:0, 「store_textposition」:空}]}

整頓你這樣

JSONObject obj = new JSONObject(jsonData); // Problem here 
JSONArray jsonArray= obj.getJsonArray("data"); 
for(int i=0;i<jsonArray.length();i++) 
     { 
      // your code 
     } 

希望這有助於你的代碼。

0

您的解析函數應該如下所示。

private boolean parse() 
    { 
     try 
     { 
      JSONObject ja = new JSONObject(jsonData); 
      JSONArray dataArray = ja.getJSONArray("data"); 
      shops.clear(); 
      for(int i=0;i<dataArray.length();i++) 
      { 
       JSONObject jo = dataArray.getJSONObject(i); 
       String store_name = jo.getString("store_name"); 
       shops.add(store_name); 
      } 
      return true; 
     } 
     catch (JSONException e) 
     { 
      e.printStackTrace(); 
      return false; 
     } 
    } 
0

您可以將現有解析邏輯替換爲GSON。這會加快&提高生產力。

要開始,

創建2個POJO類,

Data.class

public class Data { 

    @SerializedName("_id") 
    @Expose 
    private String id; 
    @SerializedName("store_name") 
    @Expose 
    private String storeName; 
    @SerializedName("store_view") 
    @Expose 
    private Integer storeView; 
    @SerializedName("store_textposition") 
    @Expose 
    private Object storeTextposition; 

    public String getId() { 
    return id; 
    } 

    public void setId(String id) { 
    this.id = id; 
    } 

    public String getStoreName() { 
    return storeName; 
    } 

    public void setStoreName(String storeName) { 
    this.storeName = storeName; 
    } 

    public Integer getStoreView() { 
    return storeView; 
    } 

    public void setStoreView(Integer storeView) { 
    this.storeView = storeView; 
    } 

    public Object getStoreTextposition() { 
    return storeTextposition; 
    } 

    public void setStoreTextposition(Object storeTextposition) { 
    this.storeTextposition = storeTextposition; 
    } 

    } 

Store.class

public class Store { 

@SerializedName("action") 
@Expose 
private String action; 
@SerializedName("error") 
@Expose 
private String error; 
@SerializedName("data") 
@Expose 
private List<Data> data = null; 

public String getAction() { 
return action; 
} 

public void setAction(String action) { 
this.action = action; 
} 

public String getError() { 
return error; 
} 

public void setError(String error) { 
this.error = error; 
} 

public List<Data> getData() { 
return data; 
} 

public void setData(List<Data> data) { 
this.data = data; 
} 

} 

現在主要內活動,聲明一個私有變量並初始化它。

private List<Store> store; 

添加以下代碼你的AsyncTask裏面,

@Override 
     protected String doInBackground(Void... params) { 
      try { 
       //Create an HTTP client 
       HttpClient client = new DefaultHttpClient(); 
       HttpPost post = new HttpPost(SERVER_URL); 

       //Perform the request and check the status code 
       HttpResponse response = client.execute(post); 
       StatusLine statusLine = response.getStatusLine(); 
       if(statusLine.getStatusCode() == 200) { 
        HttpEntity entity = response.getEntity(); 
        InputStream content = entity.getContent(); 

        try { 
         Reader reader = new InputStreamReader(content); 
         GsonBuilder gsonBuilder = new GsonBuilder(); 
       gsonBuilder.setDateFormat("M/d/yy hh:mm a"); 
         Gson gson = gsonBuilder.create(); 
         List<Store> store = new ArrayList<Store>(); 
         store = Arrays.asList(gson.fromJson(reader, Store[].class)); 
         content.close(); 

         handlePostsList(posts); 
        } catch (Exception ex) { 
         Log.e(TAG, "Failed to parse JSON due to: " + ex); 
        } 
       } 
      } catch(Exception ex) { 
       Log.e(TAG, "Failed to send HTTP POST request due to: " + ex); 
      } 
      return null; 
     } 

最後,你會得到存儲對象的由GSON分析數據的列表。

要獲得商店對象的任何屬性..摹STORE_NAME只需撥打下面的代碼

String store_name = store.get(position).getStoreName(); 
0

使用解析您的JSON響應:

private void parse(String jsonData) 
    { 
     try 
     { 
      JSONObject jsonObject = new JSONObject(jsonData); 
      String action = jsonObject.optString("action"); 
      String error = jsonObject.optString("error"); 
      JSONArray dataArray = jsonObject.getJSONArray("data"); 
      shops.clear(); 
      for(int i=0;i<dataArray.length();i++) 
      { 
       JSONObject jsonObject1 = dataArray.getJSONObject(i); 
       String _id = jsonObject1.optString("_id"); 
       String store_name = jsonObject1.optString("store_name"); 
       String store_view = jsonObject1.optString("store_view"); 
       String store_textposition = jsonObject1.optString("store_textposition"); 
       shops.add(store_name); 
      } 
     } 
     catch (JSONException e) 
     { 
      e.printStackTrace(); 
     } 
    }