Lix_Camel 2021-12-26 20:07 采纳率: 50%
浏览 80
已结题

解析json时部分内容未正常显示

问题遇到的现象和发生背景

安卓应用开发的时候将json转换成array,部分内容是默认值,0和null之类的,数据源没有空值
数据源

https://api.thingspeak.com/channels/1617576/feed.json
代码参考了:
https://blog.csdn.net/qq_37377691/article/details/105653454
中的内容
他的代码是完全可以正常显示的。

问题相关代码,请勿粘贴截图
public class MainActivity extends AppCompatActivity {
    private ListView Lv_main_list;
    private List<DATA> DATAList = new ArrayList<DATA>();
    private ProgressDialog progressDialog;
    private MyAdapter myAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Lv_main_list =(ListView) findViewById(R.id.Lv_main_list);
        //实例化进度条对话框
        progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("正在加载中!");
        myAdapter = new MyAdapter();
        Lv_main_list.setAdapter(myAdapter);
    }



    //适配器
    class MyAdapter extends BaseAdapter {

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

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

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

        //添加JSON数据对应出来的TextView,显示到主界面,非主要代码
        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            LinearLayout layout = new LinearLayout(MainActivity.this);
            layout.setOrientation(LinearLayout.VERTICAL);
            TextView textViewentry_id = new TextView(MainActivity.this);
            textViewentry_id.setText(DATAList.get(i).getentry_id()+"\t"+" ");
            TextView textViewfield1 = new TextView(MainActivity.this);
            textViewfield1.setText(DATAList.get(i).getfield1()+"\t");
            TextView textViewfield2 = new TextView(MainActivity.this);
            textViewfield2.setText(DATAList.get(i).getfield2()+"\t");
            TextView textViewcreated_at= new TextView(MainActivity.this);
            textViewcreated_at.setText(DATAList.get(i).getcreated_at()+"\t");
            layout.addView(textViewentry_id);
            layout.addView(textViewfield1);
            layout.addView(textViewfield2);
            layout.addView(textViewcreated_at);

            return layout;
        }
    }


    //获取xml数据
    public void getJson(View view){
        new MyTask().execute();
    }
    //通过异步任务类获取数据
    class MyTask extends AsyncTask {
        private  DATA jsonTeacherEntity;
        //准备执行
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog.show();
        }

        @Override
        protected Object doInBackground(Object[] objects) {
            //首先我们要通过代码从android端通过get或者post方式访问网页,并获取网页的内容
            //path为获取JSON数据的接口
            String path="https://api.thingspeak.com/channels/1617576/feed.json";
            try {
                URL url = new URL(path);
                //获取连接对象
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                //设置请求方式
                    httpURLConnection.setRequestMethod("GET");
                //设置连接超时
                httpURLConnection.setConnectTimeout(5000);
                //获取响应码
                int code = httpURLConnection.getResponseCode();

                if (code==200)
                {
                    //响应成功,获取服务器返回过来的数据
                    final InputStream is = httpURLConnection.getInputStream();
                    //测试数据
                    StringBuffer stringBuffer = new StringBuffer();
                    String str=null;
                    BufferedReader br = new BufferedReader(new InputStreamReader(is));
                    while ((str=br.readLine())!=null){
                        stringBuffer.append(str);

                    }

                    //使用fastJson解析Json
                    Log.e("Json数据", "Json数据: "+stringBuffer.toString() );
                    /*
                        因为JSON数据里有一些我们不需要的属性,我们需要把
                       需要的Json数据提取出来,这里我写得比较复杂,方便学习
                                */
                    String Data = stringBuffer.toString();
                    JSONObject jb = JSON.parseObject(Data);
                    String data3 = jb.getString("feeds");
                    Log.e("data3", "data3"+data3);
                    List<DATA> DATAs = JSON.parseArray(data3, DATA.class);

                    Log.e("field1","TT "+ DATAs );

                    for (DATA TT:DATAs)
                    {
                        jsonTeacherEntity = new DATA();
                        //Log.e("field1","TT "+ TT.getcreated_at() );

                        int entry_id = TT.getentry_id();
                        String field1 = TT.getfield1();
                        String field2 = TT.getfield2();
                        String created_at = TT.getcreated_at();
                        //Log.e("field1","field1 "+ field1 );
                        //Log.e("id","id"+entry_id);
                        //Log.e("created_atd","created_at"+created_at);
                        //Log.e("DATAs","DATAs"+DATAs);

                        jsonTeacherEntity.setfield1(field1);
                        jsonTeacherEntity.setfield2(field2);
                        jsonTeacherEntity.setentry_id(entry_id);
                        jsonTeacherEntity.setcreated_at(created_at);
                        DATAList.add(jsonTeacherEntity);
                    }
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
        @Override
        protected void onPostExecute(Object o) {
            super.onPostExecute(o);
            //通知适配器发生改变
            myAdapter.notifyDataSetChanged();
            //取消进度条对话框
            progressDialog.cancel();
        }

    }

}

DATA类:

package com.example.thingspeakdata;

public class DATA {
    private int entry_id;//编号
    private String field1;//field1
    private String field2;//field2
    private String created_at;//time
    public int getentry_id() {
        return entry_id;
    }

    public void setentry_id(int entry_id) {
        this.entry_id = entry_id;
    }

    public String getfield1() {
        return field1;
    }

    public void setfield1(String field1) {
        this.field1 = field1;
    }

    public String getfield2() {
        return field2;
    }

    public void setfield2(String field2) {
        this.field2 = field2;
    }

    public String getcreated_at() {
        return created_at;
    }

    public void setcreated_at(String created_at) {
        this.created_at = created_at;
    }
}

运行结果及报错内容

img

我的解答思路和尝试过的方法

在调试的时候发现,在data3中显示为正常[{"field1":"19","field2":"61","entry_id":735,"created_at":"2021-12-26T10:52:48Z"},{"field1":"19","field2":"61","entry_id":736,"created_at"
但是在后面经过JSON.parseArray后在for循环里面就显示为空值了,由于还是第一次接触json相关内容,没能尝试更多方法。

我想要达到的结果

想达到的结果就是全部正常显示

  • 写回答

1条回答 默认 最新

  • iDiry 2021-12-26 20:42
    关注

    你的131行看看有值吗

    Log.e("created_atd","created_at"+created_at);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月3日
  • 已采纳回答 12月26日
  • 创建了问题 12月26日

悬赏问题

  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000
  • ¥30 ppOCRLabel导出识别结果失败