JSONParser使用大括号获取完整的JSON文件

时间:2016-02-14 07:38:06

标签: android json

我正在尝试实现从服务器获取JSON数据的示例JSON数据App

我正在获取完整的JSON文件我的编码有什么问题?

我正在关注youtube教程,但他成功了,但我得到了完整的JSON文件

这是JSON服务器端文件

{
"movies" :[
{
 "movie" : "Avenger",
"year" : 2012
}
]
}

这是Android应用程序的代码

package com.yog.jsonparser;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.URLUtil;
import android.widget.Button;
import android.widget.TextView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
    TextView tvData;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    Button btnHit = (Button) findViewById(R.id.btnHit);
         tvData = (TextView)findViewById(R.id.tvJsonItem);
btnHit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        new JSONTask().execute("http://myDomainName.com/getData.txt");
    }
});
    }

    public class JSONTask extends AsyncTask<String,String,String>{
        HttpURLConnection connection = null;
        BufferedReader reader = null;
        URI url;
        StringBuffer buffer;
        @Override
        protected String doInBackground(String... params){
         try{

             //URL OF REQUESTED PAGE
             url=new URI(params[0]);
             connection = (HttpURLConnection) (new URL(params[0]).openConnection());
             connection.connect();
             InputStream stream=connection.getInputStream();
             reader=new BufferedReader(new InputStreamReader(stream));
              buffer=new StringBuffer();
             String line;
             while((line =reader.readLine())!=null){
                 buffer.append(line);
             }
             String finalJSON=buffer.toString();
             JSONObject parentOject = new JSONObject(finalJSON);
             JSONArray parentArray = parentOject.getJSONArray("movies");
             JSONObject finalObject= parentArray.getJSONObject(0);
             String movieName= finalObject.getString("movie");
             int year=finalObject.getInt("year");
           return movieName + "-" + year;
         } catch (URISyntaxException e) {
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
         } catch (JSONException e) {
             e.printStackTrace();
         } finally {


             if(connection !=null){
                 connection.disconnect();
             }
             try{
                 if(reader !=null){
                     reader.close();
                 }
             } catch (IOException e) {
                 e.printStackTrace();
             }

         }

         return null;

     }



        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            tvData.setText(buffer.toString());
        }
    }

}

当前输出:

{&#34;电影&#34; :[{&#34;电影&#34; :&#34; Avenger&#34;,&#34;年&#34; :2012}]}

预期产量:   复仇者   2012

2 个答案:

答案 0 :(得分:1)

更改您的onPostExecute方法,如下所示。

@Override
protected void onPostExecute(String s) {
    super.onPostExecute(s);
    tvData.setText(s);
}

此处s将是doInBackground的返回语句。 &#34; movieName +&#34; - &#34; +年; &#34;

答案 1 :(得分:1)

您在{"movies" :[{ "movie" : "Avenger","year" : 2012}]}中收到TextView,因为您正在将缓冲区的输出设置为TextView。像这样更改onPostExecute

@Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            if(s != null){
            tvData.setText(s);
            }else{
            //// Some error occurred
            tvData.setText(buffer.toString());
            }

        }