【问题标题】:Creating New Object with JSON Parsing Data使用 JSON 解析数据创建新对象
【发布时间】:2018-02-22 00:38:50
【问题描述】:

我正在练习 JSON。我正在使用新闻 api,我只检索新闻的名称、作者和标题。 我使用 NewsModel java 类来保存新闻。手动,我可以将数据添加到此类并显示在列表视图中。

我解析成功,但我无法成功地将新闻数据添加到我的模型类中。

这是我的 MainActivity(解析和添加数据到模型类)

public class MainActivity extends AppCompatActivity {

public TextView textView_parse;
private Button button_parse, button_list;
public NewsModel newsModel;
public double temp;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //
    textView_parse = (TextView)findViewById(R.id.textView_parse);
    button_parse = (Button) findViewById(R.id.button_parse);
    button_list = (Button)findViewById(R.id.button_list);
    //

    button_parse.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            new JSONParsing().execute("https://newsapi.org/v2/top-headlines?sources=abc-news&apiKey=b1ed0a1fd9ca444fa9a9dd52b754fc6b");

        }
    });

    button_list.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(MainActivity.this, NewsListActivity.class));
        }
    });
}

private class JSONParsing extends AsyncTask<String, String, String>{


    @Override
    protected String doInBackground(String... strings) {

        HttpURLConnection httpURLConnection = null;
        BufferedReader bufferedReader = null;

        try{
            URL url = new URL(strings[0]);
            httpURLConnection = (HttpURLConnection)url.openConnection();
            httpURLConnection.connect();

            InputStream stream = httpURLConnection.getInputStream();
            bufferedReader = new BufferedReader(new InputStreamReader(stream));
            StringBuffer stringBuffer = new StringBuffer();
            String line = "";

            while((line = bufferedReader.readLine()) != null){
                stringBuffer.append(line);
            }

            String finalJson = stringBuffer.toString();

            StringBuffer finalBuffer = new StringBuffer();
            JSONObject jsonObject = new JSONObject(finalJson);
            JSONArray parentArray = jsonObject.getJSONArray("articles");



            for(int i=0; i<parentArray.length(); i++){

                JSONObject parentObject = parentArray.getJSONObject(i);
                JSONObject secondObject = parentObject.getJSONObject("source");
                String name = secondObject.getString("name");
                String author = parentObject.getString("author");
                String title = parentObject.getString("title");

                newsModel = new NewsModel(name,author,title,i);
                finalBuffer.append("Name: "+name+"\n\n"+ "Author: "+author+ "\n\n"+ "Title: "+title+"\n\n\n\n");

            }

            /* tek çekim
            JSONObject parentObject = parentArray.getJSONObject(0);
            String title = parentObject.getString("title");
            */


            return finalBuffer.toString();

        }catch (IOException e){
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }


        return null;

    }

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

        textView_parse.setText(s);

    }
}

}

这是我的模型类;

public class NewsModel {
String name;
String author;
String title;
int id;

public NewsModel(){}

public NewsModel(String name, String author, String title, int id) {
    this.name = name;
    this.author = author;
    this.title = title;
    this.id=id;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getAuthor() {
    return author;
}

public void setAuthor(String author) {
    this.author = author;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

}

这是我的适配器类;

public class Adapter_NewsList extends BaseAdapter {

private Context mContext;
public List<NewsModel> mNewsList;

public Adapter_NewsList(Context mContext, List<NewsModel> mNewsList) {
    this.mContext = mContext;
    this.mNewsList = mNewsList;
}

@Override
public int getCount() {
    return mNewsList.size();
}

@Override
public Object getItem(int i) {
    return mNewsList.get(i);
}

@Override
public long getItemId(int i) {
    return i;
}

@Override
public View getView(int i, View view, ViewGroup viewGroup) {

    View myView = View.inflate(mContext, R.layout.item_news_list,null);
    TextView textView_name = (TextView)myView.findViewById(R.id.textView_name);
    TextView textView_author = (TextView)myView.findViewById(R.id.textView_author);
    TextView textView_title = (TextView)myView.findViewById(R.id.textView_title);

    textView_name.setText(mNewsList.get(i).getName());
    textView_author.setText(mNewsList.get(i).getAuthor());
    textView_title.setText(mNewsList.get(i).getTitle());

    myView.setTag(mNewsList.get(i).getId());

    return myView;
}

}

【问题讨论】:

  • 您没有将模型对象添加到列表中,也没有将其设置到适配器。 This 可能会给你一些想法。

标签: java android json


【解决方案1】:

您必须将对象存储在可以转发给适配器的列表中

public class MainActivity extends AppCompatActivity {

public TextView textView_parse;
private Button button_parse, button_list;
public NewsModel newsModel;
public double temp;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //
    textView_parse = (TextView)findViewById(R.id.textView_parse);
    button_parse = (Button) findViewById(R.id.button_parse);
    button_list = (Button)findViewById(R.id.button_list);
    //

    button_parse.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            new JSONParsing().execute("https://newsapi.org/v2/top-headlines?sources=abc-news&apiKey=b1ed0a1fd9ca444fa9a9dd52b754fc6b");

        }
    });

    button_list.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(MainActivity.this, NewsListActivity.class));
        }
    });
}

private class JSONParsing extends AsyncTask<String, String, String>{


    @Override
    protected String doInBackground(String... strings) {

        HttpURLConnection httpURLConnection = null;
        BufferedReader bufferedReader = null;
        ArrayList<NewsModel> newsModels = new ArrayList<>(); //create a list

        try{
            URL url = new URL(strings[0]);
            httpURLConnection = (HttpURLConnection)url.openConnection();
            httpURLConnection.connect();

            InputStream stream = httpURLConnection.getInputStream();
            bufferedReader = new BufferedReader(new InputStreamReader(stream));
            StringBuffer stringBuffer = new StringBuffer();
            String line = "";

            while((line = bufferedReader.readLine()) != null){
                stringBuffer.append(line);
            }

            String finalJson = stringBuffer.toString();

            StringBuffer finalBuffer = new StringBuffer();
            JSONObject jsonObject = new JSONObject(finalJson);
            JSONArray parentArray = jsonObject.getJSONArray("articles");



            for(int i=0; i<parentArray.length(); i++){

                JSONObject parentObject = parentArray.getJSONObject(i);
                JSONObject secondObject = parentObject.getJSONObject("source");
                String name = secondObject.getString("name");
                String author = parentObject.getString("author");
                String title = parentObject.getString("title");

                newsModel = new NewsModel(name,author,title,i);
                newsModels.add(newsModel); //keep storing model object in list
                finalBuffer.append("Name: "+name+"\n\n"+ "Author: "+author+ "\n\n"+ "Title: "+title+"\n\n\n\n");

            }

            /* tek çekim
            JSONObject parentObject = parentArray.getJSONObject(0);
            String title = parentObject.getString("title");
            */


            return finalBuffer.toString(); //return list here and use that in adapter

        }catch (IOException e){
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }


        return null;

    }

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

        textView_parse.setText(s);

    }
}

【讨论】:

  • 谢谢,我照你说的做了。但是我将在哪里以及如何在此处设置适配器 onPostExecute?
【解决方案2】:

作为@architjn 的回答,稍作修改。

换行

AsyncTask<String, String, String>

AsyncTask<String, String, ArrayList<NewsModel>>

然后更新覆盖函数如下

private class JSONParsing extends AsyncTask<String, String, ArrayList<NewsModel>> {


    @Override
    protected ArrayList<NewsModel> doInBackground(String... strings) {

        HttpURLConnection httpURLConnection = null;
        BufferedReader bufferedReader = null;
        ArrayList<NewsModel> newsModels = new ArrayList<>(); //create a list
        NewsModel newsModel = null; 

        try {
            URL url = new URL(strings[0]);
            httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.connect();

            InputStream stream = httpURLConnection.getInputStream();
            bufferedReader = new BufferedReader(new InputStreamReader(stream));
            StringBuffer stringBuffer = new StringBuffer();
            String line = "";

            while ((line = bufferedReader.readLine()) != null) {
                stringBuffer.append(line);
            }

            String finalJson = stringBuffer.toString();

            StringBuffer finalBuffer = new StringBuffer();
            JSONObject jsonObject = new JSONObject(finalJson);
            JSONArray parentArray = jsonObject.getJSONArray("articles");


            for (int i = 0; i < parentArray.length(); i++) {

                JSONObject parentObject = parentArray.getJSONObject(i);
                JSONObject secondObject = parentObject.getJSONObject("source");
                String name = secondObject.getString("name");
                String author = parentObject.getString("author");
                String title = parentObject.getString("title");

                newsModel = new NewsModel(name, author, title, i);
                newsModels.add(newsModel); //keep storing model object in list
                finalBuffer.append("Name: " + name + "\n\n" + "Author: " + author + "\n\n" + "Title: " + title + "\n\n\n\n");

            }

        /* tek çekim
        JSONObject parentObject = parentArray.getJSONObject(0);
        String title = parentObject.getString("title");
        */


            return newsModels; //return list here and use that in adapter

        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }


        return null;

    }

    @Override
    protected void onPostExecute(ArrayList<NewsModel> resultList) {
        super.onPostExecute(resultList);
        //set up the adapter with resultList
    }
}

毕竟,您可以使用 resultList 参数在 onPostExecute(ArrayList resultList) 方法中将列表设置为适配器,祝你好运。

【讨论】:

    【解决方案3】:

    ArrayList newsmodel = new ArrayList();

    newsmodel=new Gson().fromJson(parentArray.toString(), new TypeToken>() {}.getType());

    试试这个,它可能对你有用,对我也有用。

    【讨论】:

      猜你喜欢
      • 2012-11-11
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 2014-11-06
      相关资源
      最近更新 更多