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


Unalbe to parse json Array in Android Application

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

下载活动.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显示"无法转换为json数组"。我已使用此链接获取数据。http://necrecords.16mb.com/getlink.php?password=acchata%20mucchata

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

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();
    }
}