Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取json字符串的值,然后通过此函数对其进行解析_Java_Android_Json - Fatal编程技术网

Java 如何获取json字符串的值,然后通过此函数对其进行解析

Java 如何获取json字符串的值,然后通过此函数对其进行解析,java,android,json,Java,Android,Json,我有以下方法将SS连接到db并返回一个json数组 private String getServerData(String returnString) { InputStream is = null; String result = ""; //the year data to send ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValu

我有以下方法将SS连接到db并返回一个json数组

private String getServerData(String returnString) {

       InputStream is = null;

       String result = "";
        //the year data to send
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("year","1970"));

        //http post
        try{
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost(KEY_121);
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();

        }catch(Exception e){
                Log.e("log_tag", "Error in http connection "+e.toString());
        }

        //convert response to string
        try{
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                }
                is.close();
                result=sb.toString();
        }catch(Exception e){
                Log.e("log_tag", "Error converting result "+e.toString());
        }

        try{
                JSONArray jArray = new JSONArray(result);
                for(int i=0;i<jArray.length();i++){
                   // JSONObject json_data = jArray.getJSONObject(i);
                    JSONObject json_data = jArray.getJSONObject(i);
                    Log.i("log_tag","id: "+json_data.getInt("id")+
                            ", name: "+json_data.getString("name")+
                            ", sex: "+json_data.getInt("sex")+
                            ", birthyear: "+json_data.getInt("birthyear")
                    );


                        //Get an output to the screen
                        returnString += "\n\t" + jArray.getJSONObject(i); 
                }
        }catch(JSONException e){
                Log.e("log_tag", "Error parsing data "+e.toString());

                returnString += result.toString();
        }
        return returnString; 
    }   
私有字符串getServerData(字符串返回字符串){
InputStream=null;
字符串结果=”;
//要发送的年度数据
ArrayList nameValuePairs=新的ArrayList();
名称值对。添加(新的基本名称值对(“年份”、“1970”);
//http post
试一试{
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(键号121);
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
HttpResponse response=httpclient.execute(httppost);
HttpEntity=response.getEntity();
is=entity.getContent();
}捕获(例外e){
e(“Log_标记”,“http连接错误”+e.toString());
}
//将响应转换为字符串
试一试{
BufferedReader reader=新的BufferedReader(新的InputStreamReader(is,“iso-8859-1”),8;
StringBuilder sb=新的StringBuilder();
字符串行=null;
而((line=reader.readLine())!=null){
sb.追加(第+行“\n”);
}
is.close();
结果=sb.toString();
}捕获(例外e){
Log.e(“Log_标记”,“错误转换结果”+e.toString());
}
试一试{
JSONArray jArray=新JSONArray(结果);
对于(int i=0;i由于执行
getServerData()
需要一段时间(它包含一个http请求),因此不能直接从UI线程运行它。(
onCreate()
直接在UI线程上,UI线程永远不应该暂停)

这意味着您必须创建一个并从
AsyncTask
doInBackground()
调用
getServerData()
。您可以在
AsyncTask
onPostExecute()
中返回显示JSON结果

这意味着您希望将结果显示位置的传递给
AsyncTask
。您希望将其设置为
SoftReference
,以防在获取JSON时发生问题(就像您离开活动一样)

我建议您阅读,并使用创建您自己的项目。一旦启动并运行了该项目,请将该图像下载程序修改为JSON下载程序。这篇文章应该对您非常有帮助,因为它还使用适配器在列表视图中显示项目

您的示例与本文中的示例在几个方面有所不同,但我认为它实际上更简单,因此,如果您对本文中的代码有足够的了解,那么您就可以在之后使代码正常工作

参考文献:




以下是我所做的,效果很好

1-我没有返回字符串,而是将结果原样返回给调用

然后我构建了一个字符串,然后我就可以像这样解析它了

 returnedResult = this.getServerData(KEY_121);
       try {
        JSONArray jArray = new JSONArray(returnedResult);
        for(int i=0;i<jArray.length();i++){
            // JSONObject json_data = jArray.getJSONObject(i);
            JSONObject json_data = jArray.getJSONObject(i);

            hm = new HashMap<String, Object>();
            hm.put(IDKEY, json_data.getInt("id"));
            hm.put(NAMEKEY, json_data.getString("name"));
            hm.put(IMGKEY, R.raw.android);
            myBooks.add(hm);

        }
returnedResult=this.getServerData(键121);
试一试{
JSONArray jArray=新JSONArray(returnedResult);

对于(inti=0;iHi-Peter),虽然建议不错,但我并不是在寻找答案。不过,我认为我已经接近解决这个问题了,如果可行的话,我会将其发布在这里。感谢有价值的链接
 returnedResult = this.getServerData(KEY_121);
       try {
        JSONArray jArray = new JSONArray(returnedResult);
        for(int i=0;i<jArray.length();i++){
            // JSONObject json_data = jArray.getJSONObject(i);
            JSONObject json_data = jArray.getJSONObject(i);

            hm = new HashMap<String, Object>();
            hm.put(IDKEY, json_data.getInt("id"));
            hm.put(NAMEKEY, json_data.getString("name"));
            hm.put(IMGKEY, R.raw.android);
            myBooks.add(hm);

        }