2017-08-14 72 views
0

我试图让JSON数据的应用程序,但得到JSON异常使用JSON web服务时遇到

MainActivity

public class MainActivity extends AppCompatActivity { 

private ListView mListView; 
private List<Project> projects = new ArrayList<>(); 
private ProgressDialog progressDialog; 


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

    mListView = (ListView) findViewById(R.id.listView); 

    progressDialog = new ProgressDialog(this); 
    progressDialog.setMessage("Loading...."); 
    progressDialog.setCancelable(false); 

    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Intent intent = new Intent(MainActivity.this,Main2Activity.class); 
      startActivity(intent); 
     } 
    }); 

    Button mFilterButton = (Button) findViewById(R.id.filter_button); 
    mFilterButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      PopupMenu popupMenu = new PopupMenu(MainActivity.this,v); 
      popupMenu.inflate(R.menu.filter_menu); 
      popupMenu.show(); 

     } 
    }); 

    Button mSortButton = (Button) findViewById(R.id.sort_button); 
    mSortButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      PopupMenu popupMenu = new PopupMenu(MainActivity.this,v); 
      popupMenu.inflate(R.menu.sort_menu); 
      popupMenu.show(); 
     } 
    }); 

    new GSONExecution().execute(); 
} 


private class GSONExecution extends AsyncTask<Void, Void, Boolean>{ 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     progressDialog.show(); 
    } 

    @Override 
    protected Boolean doInBackground(Void... params) { 
     String urlString = "http://starlord.hackerearth.com/kickstarter"; 

     try { 
      URL url = new URL(urlString); 

      HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection(); 
      httpURLConnection.setRequestMethod("GET"); 
      int res = httpURLConnection.getResponseCode(); 

      if (res == 200){ 
       InputStream inputStream = httpURLConnection.getInputStream(); 
       String s = convertStreamToString(inputStream); 
       Log.v("Response :" , " is "+ s); 

       JSONObject rootObject = new JSONObject(s); 
       JSONArray jsonArray = rootObject.getJSONArray(""); 

       for (int i=0; i<=jsonArray.length(); i++){ 
        JSONObject contactObject = jsonArray.getJSONObject(i); 

        String titleValue = contactObject.getString("title"); 
        Integer pledgedValue = contactObject.getInt("amt.pledged"); 
        Integer backersValue = contactObject.getInt("num.backers"); 

        Project project = new Project(); 
        project.setPleadges(pledgedValue); 
        project.setBackers(backersValue); 
        project.settitle(titleValue); 
        projects.add(project); 

        Log.v("Object details : " , " : " + pledgedValue + " : " + backersValue); 
       } 
      } 
     } catch (IOException | JSONException e) { 
      e.printStackTrace(); 
     } 
     return true; 
    } 

    @Override 
    protected void onPostExecute(Boolean isOperationCompleted) { 
     super.onPostExecute(isOperationCompleted); 
     if (isOperationCompleted){ 
      if (progressDialog.isShowing()){ 
       progressDialog.dismiss(); 
      } 
      ProjectAdapter adapter = new ProjectAdapter(MainActivity.this, projects); 
      mListView.setAdapter(adapter); 
     } 
    } 

    @NonNull 
    private String convertStreamToString(InputStream inputStream) { 
     StringBuilder stringBuilder = new StringBuilder(); 
     try { 
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"iso-8859-1"),8); 
      String line; 
      while ((line = bufferedReader.readLine()) != null) 
       stringBuilder.append(line).append("\n"); 
      inputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return stringBuilder.toString(); 
    } 
} 
} 

项目

public class Project { 

String mtitle; 
Integer mPleadges; 
Integer mBackers; 
String mNoDays; 

public String gettitle() { 
    return mtitle; 
} 

public void settitle(String mtitle) { 
    this.mtitle = mtitle; 
} 

public Integer getPleadges() { 
    return mPleadges; 
} 

public void setPleadges(Integer mPleadges) { 
    this.mPleadges = mPleadges; 
} 

public Integer getBackers() { 
    return mBackers; 
} 

public void setBackers(Integer mBackers) { 
    this.mBackers = mBackers; 
} 

public String getNoDays() { 
    return mNoDays; 
} 

public void setNoDays(String mNoDays) { 
    this.mNoDays = mNoDays; 
} 
} 

ProjectAdapter

class ProjectAdapter extends BaseAdapter{ 

private List<Project> mList; 
private Context mContext; 

public ProjectAdapter(MainActivity mainActivity, List<Project> projects) { 

    this.mList = projects; 
    this.mContext = mainActivity; 
} 

@Override 
public int getCount() { 
    return mList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return mList.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    convertView = inflater.inflate(R.layout.project_details,null,false); 

    final TextView projectName = (TextView) convertView.findViewById(R.id.projectName); 
    TextView pleadge = (TextView) convertView.findViewById(R.id.pledges); 
    TextView backers = (TextView) convertView.findViewById(R.id.backers); 

    projectName.setText(mList.get(position).gettitle()); 
    pleadge.setText(mList.get(position).getPleadges()); 
    backers.setText(mList.get(position).getBackers()); 

    return convertView; 
} 

}

我得到org.json.JSONException:值 在org.json.JSON.typeMismatch(JSON.java:111)

我希望你明白的问题,我仍然在学习阶段,请给予简短的回答,以便我能理解。

+0

显示你的json api响应 –

+0

它看起来像你没有正确解析响应。分享您的JSON响应。 –

+0

检查下面的答案 –

回答

2

您是从响应越来越JSONArray并试图抓住JSONObject导致org.json.JSONException: Value at org.json.JSON.typeMismatch(JSON.java:111)错误

试试这个

try { 
    JSONArray jsonArrayLST = new JSONArray(s); 
    for (int i = 0; i < jsonArrayLST.length(); i++) { 
     JSONObject contactObject= jsonArrayLST.getJSONObject(i); 

     String titleValue = contactObject.getString("title"); 
     Integer pledgedValue = contactObject.getInt("amt.pledged"); 
     Integer backersValue = contactObject.getInt("num.backers"); 

     Project project = new Project(); 
     project.setPleadges(pledgedValue); 
     project.setBackers(backersValue); 
     project.settitle(titleValue); 
     projects.add(project); 

     Log.v("Object details : " , " : " + pledgedValue + " : " + backersValue); 
    } 
} catch (JSONException e) { 
    e.printStackTrace(); 
} 

另外,你需要在设置项的TextView在适配器改变,因为你的正在设置int值导致你android.content.res.Resources$NotFoundException: String resource ID错误

pleadge.setText(String.valueOf(mList.get(position).getPleadges())); 
backers.setText(String.valueOf(mList.get(position).getBackers())); 
+0

现在应用程序崩溃。在pleadge.setText(mList.get(position).getPleadges())处获得FATAL EXCEPTION,资源$ NotFoundException;在适配器 –

+0

中使用pleadge.setText(String.valueOf(mList.get(position).getPleadges())); – akhilesh0707

+0

你正在设置int值为textview这是抛出错误'android.content.res.Resources $ NotFoundException:字符串资源ID' – akhilesh0707