Android JsonObject和JsonArray解析

前言

从接口获取一大堆字符串的时候,需要通过解析保存到 Bean类里面使用,网上有很多开源框架Gson,Jackson可以实现,不过有一句话是怎么说的,对,就是只会用框架的程序员不是一个好的程序员

Android JsonObject和JsonArray解析_第1张图片

介绍

你们只需要记住json解析方式是一种轻量级的数据传输格式,比任何数据传输性能要高出很多


使用

http://v.juhe.cn/toutiao/index?type=&key=d05b58fa6901ad9bed77a1ef08bd6ccb

这是从 聚合数据上获取下来 的 字符串

看的是不是不清楚,这就需要一个工具给它排序 https://www.bejson.com/ 这是我从网上找的在线解析工具,看下返回的数据

{
    "reason":"成功的返回",
    "result":{
        "stat":"1",
        "data":[
            {
                "uniquekey":"4aa8ba3a720a12f1ac9b0ea2b7c1bb8b",
                "title":"中国贸促会:加强投资 推动“一带一路”建设",
                "date":"2018-04-12 18:09",
                "category":"头条",
                "author_name":"央视网",

            },      
            {
                "uniquekey":"d53883da51e856c2c96c8b219c6d06e7",
                "title":"冯俊:人类命运共同体 全球治理的中国方案",
                "date":"2018-04-12 16:06",
                "category":"头条",

            }
        ]
    },

}

是不是变清晰了好多,不过对于第一次接触这个json解析的程序员还是有点乱,所以为了让你们更加明白,我又换了一个工具JsonView,百度可搜
Android JsonObject和JsonArray解析_第2张图片

接下来就需要 最主要的两个类:

  • JSONObject
    在图里面前缀是几个方块,就要用到object ,比如 JSON 这里写图片描述
  • JSONArray
    在图里面前缀是[],就要用到array,比如 data 这里写图片描述

大概就是这样,我们简单获取你想要的一个数据,我想得到data里面 0 开头 里面的title,下面来看代码:

                        //第一步,string参数相当于一个JSON,依次解析下一步
                        JSONObject json = new JSONObject(string);
                        JSONObject result = json.getJSONObject("result");
                        //当你获得JSONArray 类型的时候,然后要写for循环遍历获取里面每一个Object
                        JSONArray data = result.getJSONArray("data");
                        for (int i = 0; i < data.length(); i++) {
                            JSONObject value = data.getJSONObject(i);
                            //获取到title值
                            String title = value.getString("title");
                          // String title = value.optString("title");

                        }

optString和getString效果是一样的,我比较推荐getString

效果图供大家参考:

Android JsonObject和JsonArray解析_第3张图片

Activity文件

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    String urlString = "http://v.juhe.cn/toutiao/index?type=&key=d05b58fa6901ad9bed77a1ef08bd6ccb\n";
    private TextView mTv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTv = findViewById(R.id.tv);
        Button bt = findViewById(R.id.bt);
        bt.setOnClickListener(this);

    }

    private Handler hand = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 1) {
                String title = (String) msg.obj;
                mTv.setText(title);
            }
        }

    };

    @Override
    public void onClick(View v) {
        //转换编码格式
        //            final String encode = URLEncoder.encode(null, "utf-8");
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //打开链接
                    URL url = new URL(urlString);
                    //找到输入流
                    URLConnection conn = url.openConnection();
                    InputStream is = conn.getInputStream();
                    //添加到缓冲输入区里
                    BufferedReader br = new BufferedReader(new InputStreamReader(is));
                    //字符串变量
                    StringBuffer sb = new StringBuffer();
                    String s = "";
                    //一行一行读下来
                    while ((s = br.readLine()) != null) {
                        sb.append(s);
                    }
                    br.close();
                    is.close();
                    String string = sb.toString();

                    //第一步,参数相当于一个JSON,依次解析下一步
                    JSONObject json = new JSONObject(string);
                    JSONObject result = json.getJSONObject("result");
                    //当你获得Array类型的时候,然后要遍历获取代表里面面每一个个Object
                    JSONArray data = result.getJSONArray("data");
                    for (int i = 0; i < data.length(); i++) {
                        JSONObject value = data.getJSONObject(i);
                        String title = value.getString("title");
                        //                        String title = value.optString("title");
                        Log.e("sss", title);
                        //传送
                        Message message = hand.obtainMessage();
                        message.what = 1;
                        message.obj = title;
                        hand.sendMessage(message);
                    }

                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }).start();

    }
}

布局文件


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.zk.jsonanalysis.MainActivity">

    <Button
        android:id="@+id/bt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="点击设置文字"
        android:textColor="#ff223B" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ff223B"
            android:text="标题:"
            android:textSize="25sp" />

        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="aa"

            android:textSize="25sp" />
    LinearLayout>


LinearLayout>

总结

1.方法后面的参数必须跟json字符串里面的值依依对应,要不然会提示为空,报出异常
2.如果使用集合存储对象,创建bean的时候,里面的声明变量也要跟json字符串名字依依对应
3.老铁双击666没毛病!!!

你可能感兴趣的:(Android,我不是程序员)