无法在Android应用程序中解析json数组

时间:2015-03-23 17:10:34

标签: java php android mysql json

我的所有应用程序都是......从第一个活动中获取一个字符串,然后在第二个活动中使用它来从mysql数据库中获取下载链接。

DownloadActivity.java

    package com.example.telugump3;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URLEncoder;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.app.DownloadManager;
import android.app.DownloadManager.Query;
import android.app.DownloadManager.Request;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class DownloadActivity extends Activity{
  Activity context;
   HttpPost httppost;
   StringBuffer buffer;
   HttpResponse response;
   HttpClient httpclient;
   ProgressDialog pd;
   CustomAdapter adapter;
   ListView listProduct;
   ArrayList<String> records;
   String mname;
   String sText;
   private long enqueue;
   private DownloadManager dm;

protected void onCreate(Bundle savedInstanceState) {
   //TODO Auto-generated method stub
   super.onCreate(savedInstanceState);
   setContentView(R.layout.download_activity);
   context=this;
   records=new ArrayList<String>();
   listProduct=(ListView)findViewById(R.id.product_list);
   adapter=new CustomAdapter(context, R.layout.thirdlist_item,R.id.pro_name, records);
   listProduct.setAdapter(adapter);
   Intent iin= getIntent();
   Bundle b = iin.getExtras();

   if(b!=null)
   {
       mname =(String) b.getString("song_name");
       System.out.print(mname);

   }

   listProduct.setOnItemClickListener(new OnItemClickListener(){ 

       @Override
       public void onItemClick(AdapterView<?> arg0, View v, int position, long id){

           String sText = ((TextView) v.findViewById(R.id.pro_name)).getText().toString();

       }

   });

   BroadcastReceiver receiver = new BroadcastReceiver() {
       @Override
       public void onReceive(Context context, Intent intent) {
           String action = intent.getAction();
           if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
               long downloadId = intent.getLongExtra(
                       DownloadManager.EXTRA_DOWNLOAD_ID, 0);
               Query query = new Query();
               query.setFilterById(enqueue);
               Cursor c = dm.query(query);
               if (c.moveToFirst()) {
                   int columnIndex = c
                           .getColumnIndex(DownloadManager.COLUMN_STATUS);
                   if (DownloadManager.STATUS_SUCCESSFUL == c
                           .getInt(columnIndex)) {

                       ImageView view = (ImageView) findViewById(R.id.imageView);
                       String uriString = c
                               .getString(c
                                       .getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                       view.setImageURI(Uri.parse(uriString));
                   }
               }
           }
       }
   };

   registerReceiver(receiver, new IntentFilter(
           DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}

public void onClick(View view) {
    dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
    Request request = new Request(
            Uri.parse(sText));
    enqueue = dm.enqueue(request);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    //create a LayoutTransition object       
      return true;
}
   public void onStart(){
   super.onStart(); 
   //execute background task
   BackTask bt=new BackTask();
   bt.execute();

   }

  //background process to make a request to server and list product information
   private class BackTask extends AsyncTask<Void,Void,Void>{  
   protected void onPreExecute(){
       super.onPreExecute();
       pd = new ProgressDialog(context);
       pd.setTitle("Retrieving data");
       pd.setMessage("Please wait.");
       pd.setCancelable(true);
       pd.setIndeterminate(true);
       pd.show();       

       }

       protected Void doInBackground(Void...params){ 

       InputStream is=null;
       String result="";
       try{

           records.clear();

           String query = URLEncoder.encode(mname, "utf-8");
       httpclient=new DefaultHttpClient();
          httppost= new HttpPost("http://necrecords.16mb.com/getsongslist.php?password="+query);
       response=httpclient.execute(httppost);         
             HttpEntity entity = response.getEntity();
             is = entity.getContent();

       }catch(Exception e){

       if(pd!=null)
       pd.dismiss();  //close the dialog if error occurs 
       Log.e("ERROR",e.getMessage());

       }

       //convert response to string
       try{
            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),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("ERROR", "Error converting result "+e.toString());

}

       //parse json data
       try{

       JSONArray jArray =new JSONArray(result);
       for(int i=0;i<jArray.length();i++){
            JSONObject json_data = jArray.getJSONObject(i);
                  String record=json_data.getString("link")+"__"+json_data.getInt("test");
                  records.add(record);


          }


       }
       catch(Exception e){
       Log.e("ERROR", "Error pasting data "+e.toString());

       }

        return null;
       }   


       protected void onPostExecute(Void result){

       if(pd!=null) pd.dismiss(); //close dialog
       adapter.notifyDataSetChanged(); //notify the ListView to get new records

       }

       public void showDownload(View view) {
           Intent i = new Intent();
           i.setAction(DownloadManager.ACTION_VIEW_DOWNLOADS);
           startActivity(i);
       }

   }
}

logcat的

03-23 22:20:51.423: E/IMGSRV(19723): :0: PVRDRMOpen: TP3, ret = 37
03-23 22:20:51.423: E/IMGSRV(19723): :0: PVRDRMOpen: TP3, ret = 38
03-23 22:20:51.423: E/IMGSRV(19723): :0: PVRDRMOpen: TP3, ret = 38
03-23 22:20:51.423: E/IMGSRV(19723): :0: PVRDRMOpen: TP3, ret = 38
03-23 22:20:52.133: E/IMGSRV(19734): :0: PVRDRMOpen: TP3, ret = 37
03-23 22:20:52.133: E/IMGSRV(19734): :0: PVRDRMOpen: TP3, ret = 38
03-23 22:20:52.133: E/IMGSRV(19734): :0: PVRDRMOpen: TP3, ret = 38
03-23 22:20:52.133: E/IMGSRV(19734): :0: PVRDRMOpen: TP3, ret = 38
03-23 22:20:52.313: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 51
03-23 22:20:52.343: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 47
03-23 22:20:52.373: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 54
03-23 22:20:52.403: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 38
03-23 22:20:52.433: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 56
03-23 22:20:52.443: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 62
03-23 22:20:52.713: E/Save(902): com.android.launcher3.Workspace$$Icicle.
03-23 22:20:52.713: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 47
03-23 22:20:53.243: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 50
03-23 22:20:53.443: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 47
03-23 22:20:54.413: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 51
03-23 22:20:54.823: E/lights(565): [LED] open path fail.
03-23 22:20:55.083: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 55
03-23 22:20:55.113: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 56
03-23 22:20:55.153: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 70
03-23 22:20:55.183: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 33
03-23 22:20:55.493: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 47
03-23 22:20:55.743: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 47
03-23 22:20:55.953: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 50
03-23 22:20:56.893: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 40
03-23 22:20:56.923: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 54
03-23 22:20:56.973: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 69
03-23 22:20:57.313: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 47
03-23 22:20:57.343: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 37
03-23 22:20:57.523: E/ERROR(19684): Error pasting data org.json.JSONException: Value null of type org.json.JSONObject$1 cannot be converted to JSONArray
03-23 22:20:57.573: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 38
03-23 22:20:57.783: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 50
03-23 22:20:59.653: E/lights(565): [LED] open path fail.
03-23 22:21:00.033: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 40
03-23 22:21:00.043: E/IMGSRV(186): :0: PVRDRMOpen: TP3, ret = 47

我想做的事情......

1)由于我不知道如何将json数据转换为字符串,我已经将它作为一个数组并在ListView中使用它。当我点击ListView时,我将以字符串的形式获得下载链接。

String sText = ((TextView) v.findViewById(R.id.pro_name)).getText().toString();

现在我可以使用此 sText 使用Android默认下载管理器下载所需文件。但是ListView没有被创建。 Logcat显示&#34;无法转换为json数组&#34;。我已使用此链接获取数据。 http://necrecords.16mb.com/getlink.php?password=acchata%20mucchata

1 个答案:

答案 0 :(得分:1)

使用以下代码,它将解析并为您提供正确的值。

new AsyncTask<Void, Void, Void>(){

            @Override
            protected Void doInBackground(Void... params) {

                try {
                    String result = callWebService("http://necrecords.16mb.com/getlink.php?password=acchata%20mucchata");
                    JSONArray resArray = new JSONArray(result);
                    for (int i=0; i<resArray.length();i++){
                        JSONObject res = resArray.getJSONObject(i);

                        String link = res.getString("link");
                        String test = res.getString("test");
                        Log.v("result ==== ", link + "   ,   " + test);
                    }

                }
                catch (Exception e){
                    e.printStackTrace();
                }


                return null;
            }
        }.execute();




public String callWebService(String urlvalue) throws Exception {
        System.setProperty("http.keepAlive", "false");
        URL u = new URL(urlvalue);
        URLConnection conn = u.openConnection();
        BufferedReader in = new BufferedReader(new InputStreamReader(
                conn.getInputStream()));
        StringBuffer buffer = new StringBuffer();
        String inputLine;
        while ((inputLine = in.readLine()) != null)
            buffer.append(inputLine);
        in.close();
        // System.out.println(buffer.toString());
        return buffer.toString();

    }

根据您的代码更新

package com.example.telugump3;

import android.app.Activity;
import android.app.DownloadManager;
import android.app.DownloadManager.Query;
import android.app.DownloadManager.Request;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.xavient.kwickhelp.testappstack.R;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.ArrayList;

public class DownloadActivity extends Activity{
    Activity context;
    HttpPost httppost;
    StringBuffer buffer;
    HttpResponse response;
    HttpClient httpclient;
    ProgressDialog pd;
    CustomAdapter adapter;
    ListView listProduct;
    ArrayList<String> records;
    String mname;
    String sText;
    private long enqueue;
    private DownloadManager dm;

    protected void onCreate(Bundle savedInstanceState) {
        //TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.download_activity);
        context=this;
        records=new ArrayList<String>();
        listProduct=(ListView)findViewById(R.id.product_list);
        adapter=new CustomAdapter(context, R.layout.thirdlist_item,R.id.pro_name, records);
        listProduct.setAdapter(adapter);
        Intent iin= getIntent();
        Bundle b = iin.getExtras();

        if(b!=null)
        {
            mname =(String) b.getString("song_name");
            System.out.print(mname);

        }

        listProduct.setOnItemClickListener(new OnItemClickListener(){

            @Override
            public void onItemClick(AdapterView<?> arg0, View v, int position, long id){

                String sText = ((TextView) v.findViewById(R.id.pro_name)).getText().toString();

            }

        });

        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                    long downloadId = intent.getLongExtra(
                            DownloadManager.EXTRA_DOWNLOAD_ID, 0);
                    Query query = new Query();
                    query.setFilterById(enqueue);
                    Cursor c = dm.query(query);
                    if (c.moveToFirst()) {
                        int columnIndex = c
                                .getColumnIndex(DownloadManager.COLUMN_STATUS);
                        if (DownloadManager.STATUS_SUCCESSFUL == c
                                .getInt(columnIndex)) {

                            ImageView view = (ImageView) findViewById(R.id.imageView);
                            String uriString = c
                                    .getString(c
                                            .getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                            view.setImageURI(Uri.parse(uriString));
                        }
                    }
                }
            }
        };

        registerReceiver(receiver, new IntentFilter(
                DownloadManager.ACTION_DOWNLOAD_COMPLETE));
    }

    public void onClick(View view) {
        dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
        Request request = new Request(
                Uri.parse(sText));
        enqueue = dm.enqueue(request);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        //create a LayoutTransition object
        return true;
    }

    @Override
    public void onStart(){
        super.onStart();
        //execute background task
       new BackTask().execute();


    }

    //background process to make a request to server and list product information
    private class BackTask extends AsyncTask<Void,Void,Void>{
        protected void onPreExecute(){
            super.onPreExecute();
            pd = new ProgressDialog(context);
            pd.setTitle("Retrieving data");
            pd.setMessage("Please wait.");
            pd.setCancelable(true);
            pd.setIndeterminate(true);
            pd.show();

        }

        protected Void doInBackground(Void...params){





            //parse json data
            try{

                String result = callWebService("http://necrecords.16mb.com/getlink.php?password=acchata%20mucchata");
                JSONArray jArray =new JSONArray(result);
                JSONArray resArray = new JSONArray(result);
                for (int i=0; i<resArray.length();i++){
                    JSONObject res = resArray.getJSONObject(i);

                    String link = res.getString("link");
                    String test = res.getString("test");
                    String record = link+"__"+test;
                    Log.v("result ==== ", link + "   ,   " + test);
                    records.add(record);
                }



            }
            catch(Exception e){
                Log.e("ERROR", "Error pasting data "+e.toString());

            }

            return null;
        }


        protected void onPostExecute(Void result){

            if(pd!=null) pd.dismiss(); //close dialog
            adapter.notifyDataSetChanged(); //notify the ListView to get new records

        }

        public void showDownload(View view) {
            Intent i = new Intent();
            i.setAction(DownloadManager.ACTION_VIEW_DOWNLOADS);
            startActivity(i);
        }

    }

    public String callWebService(String urlvalue) throws Exception {
        System.setProperty("http.keepAlive", "false");
        URL u = new URL(urlvalue);
        URLConnection conn = u.openConnection();
        BufferedReader in = new BufferedReader(new InputStreamReader(
                conn.getInputStream()));
        StringBuffer buffer = new StringBuffer();
        String inputLine;
        while ((inputLine = in.readLine()) != null)
            buffer.append(inputLine);
        in.close();
        // System.out.println(buffer.toString());
        return buffer.toString();

    }
}