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 遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

使用cxf编写webservice遇到问题

使用cxf编写webservice遇到问题

webservice 可能遇到 的问题

BizTalk - JSON Post WebService 导致 500 内部服务器错误

kettle调用一个web service 如何将返回的json字符串解析并放入数据表中

webservice 项目中遇到的问题