AndroidStudio之数据解析(JSON)

AndroidStudio之数据解析(JSON)_第1张图片

文章目录

  • 前言
  • 一、JSON是什么?
  • 二、JSON 数据类型的简单介绍
  • 三、简单实例


前言

曾经一段时间里xml成为了互联网业界内的数据传输格式标准,但是有人对xml提出了质疑,认为xml数据格式比较繁杂,冗长等弊端,于是提出了很多解决方案。
在2001年的时候JSON数据格式就出现了,并且在2006年的时候在互联网业界内开始普及使用,JSON是一种数据传输格式,而不是一门语言,基本上所有的编程语言都支持JSON数据格式。


一、JSON是什么?

  1. JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  2. JSON 是轻量级的文本数据交换格式
  3. JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。

二、JSON 数据类型的简单介绍

有效的数据类型

在 JSON 中,值必须是以下数据类型之一:

  • 字符串
  • 数字
  • 对象(JSON 对象)
  • 数组
  • 布尔
  • Null

JSON 的值不可以是以下数据类型之一:

  • 函数
  • 日期
  • undefined

JSON 字符串

JSON 中的字符串必须用双引号包围。

实例:

{ "name":"DaDaXu" }

JSON 数字

JSON 中的数字必须是整数或浮点数。

实例:

{ "age":18 }

JSON 对象

JSON 中的值可以是对象。

实例:

{
"employee":{ "name":"Bill Gates", "age":62, "city":"Seattle" }
}
  • JSON 中作为值的对象必须遵守与 JSON 对象相同的规则。

JSON 数组

JSON 中的值可以是数组。

实例:

{
"employees":[ "Bill", "Steve", "David" ]
}

JSON 布尔

JSON 中的值可以是 true/false。

实例:

{ "sale":true }

JSON null

JSON 中的值可以是 null。

实例:

{ "middlename":null }

三、简单实例

  1. 本地创建json数据并实现解析:
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_10_26);

        try {
            //No.1 JSONObject
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("country", "中国");
            jsonObject.put("city", "上海");
            jsonObject.put("street", "南京路");
            Log.d("MainActivity_10_26", jsonObject.toString());

            //No.2 JSONArray
            // index索引
            JSONArray jsonArray = new JSONArray();
            jsonArray.put(0, "1");
            jsonArray.put(1, "2");
            jsonArray.put(2, "3");
            Log.d("MainActivity_10_26", jsonArray.toString());

            //复杂的
            JSONArray jsonArray1 = new JSONArray();
            jsonArray1.put(jsonObject);
            Log.d("MainActivity_10_26", jsonArray1.toString());

            //解析json数据 JSONObject类型的
            String json = "{\"country\":\"中国\",\"city\":\"上海\",\"street\":\"南京路\"}";
            JSONObject jsonObject1 = new JSONObject(json);
            Log.d("MainActivity_10_26", "Country:" + jsonObject1.getString("country"));
            Log.d("MainActivity_10_26", "City:" + jsonObject1.getString("city"));
            Log.d("MainActivity_10_26", "Street:" + jsonObject1.getString("street"));

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

效果图:
AndroidStudio之数据解析(JSON)_第2张图片

  1. 从 web 服务器上读取 JSON 数据并展示在TextView上。

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="15dp">

    <TextView
        android:id="@+id/tvcountry"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp" />

    <TextView
        android:id="@+id/tvcity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp" />

    <TextView
        android:id="@+id/tvstreet"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp" />

</LinearLayout>

MainActivity_10_26中:

编写代码之前需要知道:Android中的线程以及Message和Handler相关知识:

Android中的线程:

线程,可以看作是进程的实体,CPU调度资源的基本单位。本质上是一串命令(也就是程序代码),执行线程可以理解为把命令交给操作系统去执行。
Java中的线程:Java中默认一个进程只有一个线程,称之为主线程。其它线程称之为子线程也叫工作线程。
Android中的线程:Android沿用了Java线程模型,Android中主线程也叫UI线程。Android3.0以后,系统要求网络访问必须在子线程中进行。


Android中Message的基本使用

1.什么是Message:
Message是封装了需要传递的数据交由Handler 处理的对象。

2.Message的作用:
用于存放传递的数据;
是主线程和子线程传递数据的载体

3.如何使用Message:
1.初始化Message对象:

方法一. Message message= new Message()//这种就是直接初始化一个Message对象,没有什么特别的。
方法二. Message message= Message.obtain()//从整个Messge池中返回一个新的Message实例,通过obtainMessage能避免重复Message创建对象。
方法三. Messager message= handler.obtaionMessager()//第二种跟第三种其实是一样的,都可以避免重复创建Message对象,所以建议用第二种或者第三种任何一个创建Message对象。

Android中使用Handler场景

  • 在开发中更新我们刷新视图都需要在主线程中更新,子线程是不支持更新视图操作的。所以当我们做一些耗时操作的时候可以不能马上得到反馈刷新UI,比如下载文件或者下载图片这些操作都比较耗时,我们一般会重新创建一个子线程异步处理耗时操作,这样就不会堵塞主线程导致卡顿的情况。这个时候Handler就起到了作用。我们可以用Handler
    Looper MessageQueue这套异步消息处理机制来处理这种情况,线程中发送消息通知,主线程来处理消息刷新视图。

Handler使用的生产消费者设计模式

  • 生产消费者模式就是类似于生活中寄快递一样,寄东西的人可以视为生产者,而快递员就是消息缓存区、快递员负责全部快递的维护和派发、只要有还有快递快递员就是一直送到没有为止,收件人就是消费者负责接收快递员的快件。可以看到整个过程发件人不需要关心收件人的具体情况,只需要把收件人的地址写对就行。而快递员也不需要关心发件人和收件人的信息,快递员只负责收快递按快递地址送到到收件人手里。收件人只需要等待快递的送达就好了。

再来看本案例:

这里需要获取的是json对象数据
AndroidStudio之数据解析(JSON)_第3张图片
代码:(此线程是在onCreate方法内的)注释掉的url是解析json数组的


        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //获取json字符串 进行解析处理
                    URL url = new URL("https://www.rxez8.com/object.json");
//                    URL url = new URL("https://www.rxez8.com/list.json");
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //与服务器建立连接
                    connection.setRequestMethod("GET");//设置请求方法
                    connection.setConnectTimeout(30000);//设置连接超时时间 默认单位为毫秒
                    connection.connect(); //开启链接

                    int responseCode = connection.getResponseCode();//获取状态码 根据状态码判断本次请求是否成功

                    InputStream inputStream = connection.getInputStream();//获取到响应的数据 通过二进制流的形式得到数据 并进行转换

                    ByteArrayOutputStream os = new ByteArrayOutputStream();
                    byte[] buffer = new byte[1024];
                    int len = -1;
                    while ((len = inputStream.read(buffer)) != -1) {
                        os.write(buffer, 0, len);
                    }
                    inputStream.close();
                    String data = os.toString();

                    //将数据发送给Handler Message
                    Message msg = Message.obtain();
                    msg.obj = data;
                    handler.sendMessage(msg);

                    Log.d("MainActivity_10_26", data);

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();

Handler:注释掉的内容是解析json数组的

    //与onCreate同级
    @SuppressLint("HandlerLeak")
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            TextView tvcountry = findViewById(R.id.tvcountry);
            TextView tvcity = findViewById(R.id.tvcity);
            TextView tvstreet = findViewById(R.id.tvstreet);
            //传递过来的是一段json字符串 这边需要去解析
            try {
                JSONObject jsonObject = new JSONObject(msg.obj.toString());
                tvcountry.setText(jsonObject.getString("country"));
                tvcity.setText(jsonObject.getString("city"));
                tvstreet.setText(jsonObject.getString("street"));

//                JSONArray jsonArray = new JSONArray(msg.obj.toString());
//                for (int i = 0; i
//                    JSONObject item = jsonArray.getJSONObject(i);
//                    String country = item.getString("country");
//                    String city = item.getString("city");
//                    String street = item.getString("street");
//                }
            } catch (Exception e) {
            }
        }
    };

效果图:
AndroidStudio之数据解析(JSON)_第4张图片


你可能感兴趣的:(网络,java,android,android,studio,json)