JSON Webservice 遇到问题
Posted
技术标签:
【中文标题】JSON Webservice 遇到问题【英文标题】:Having trouble with JSON Webservice 【发布时间】:2018-01-21 21:47:34 【问题描述】:我正在尝试将 JSON 数据获取到应用程序,但得到 JSON 异常
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;
项目适配器
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: Value 在 org.json.JSON.typeMismatch(JSON.java:111)
希望你理解问题,我还在学习阶段,所以请简要回答,以便我理解。
【问题讨论】:
显示你的 json api 响应 您似乎没有正确解析响应。分享您的 JSON 响应。 查看下面的答案 【参考方案1】:您从 Response 获得 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();
另外,您需要在将 item 设置为 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()));
【讨论】:
现在应用程序崩溃了。获取致命异常,resources$NotFoundException atpledge.setText(mList.get(position).getPleadges());在适配器中 使用pleadge.setText(String.valueOf(mList.get(position).getPleadges())); 您正在将 int 值设置为 textview,这会引发错误android.content.res.Resources$NotFoundException: String resource ID
@R.H 我已经为您的适配器进行了更改,并检查了答案
是的,知道了。谢谢以上是关于JSON Webservice 遇到问题的主要内容,如果未能解决你的问题,请参考以下文章
BizTalk - JSON Post WebService 导致 500 内部服务器错误