第22天~JSON / GSON

JSON / GSON

JSON是一种格式=物件型态用文字表示出来像用=档案很小
Map{key{Value}}


资料分三种:

  1. 结构化就是资料库tsql-先规划栏位type-放入值
  2. 半结构化-有值-分类整理 :xml档<><> +json key:value
  3. 无结构化-档案/图片

JSON是半结构化

政府开放资料: https://data.gov.tw/
点到交通-有看到JSON资料类型
https://ithelp.ithome.com.tw/upload/images/20220204/20119035CYqsxDYAzE.png

点JSON下载下来点开看-

https://ithelp.ithome.com.tw/upload/images/20220204/20119035ucrT1i7qUQ.png

https://ithelp.ithome.com.tw/upload/images/20220204/20119035bwqJp9ST6j.png
JSON档案很小可以一直塞

https://ithelp.ithome.com.tw/upload/images/20220204/201190351WA6JSyzvi.png

https://ithelp.ithome.com.tw/upload/images/20220204/20119035ayzbpOzKne.png


JSON解析器
https://jsoneditoronline.org/#left=local.dowolo&right=local.gogavu

https://ithelp.ithome.com.tw/upload/images/20220204/20119035daswWm2sb0.png

把刚刚下载的资料全部贴入

https://ithelp.ithome.com.tw/upload/images/20220204/20119035t51OxOPeLc.png


开新档案:

https://ithelp.ithome.com.tw/upload/images/20220204/20119035mcdhP0rPdX.png

布置xml档

https://ithelp.ithome.com.tw/upload/images/20220204/20119035ztrrlSqG2i.png


https://ithelp.ithome.com.tw/upload/images/20220204/201190356z0SHJxnDq.png

也是要绑 onclick

https://ithelp.ithome.com.tw/upload/images/20220204/20119035maZL2XfkcK.png

产生方法:

https://ithelp.ithome.com.tw/upload/images/20220204/20119035qbr3y57Mc6.png


自己产生JSON档

把原来的Android换成Project
https://ithelp.ithome.com.tw/upload/images/20220204/20119035OTvUUdBGZE.png

换成Project

https://ithelp.ithome.com.tw/upload/images/20220204/20119035HYYjfYzBYf.png

长这样
https://ithelp.ithome.com.tw/upload/images/20220204/20119035E3lMMSGh0U.png

展开

https://ithelp.ithome.com.tw/upload/images/20220204/20119035dbdcgHehNw.png

main-->new-->Directory
https://ithelp.ithome.com.tw/upload/images/20220204/20119035qXzSsWX3X7.png

Directory的名称-assets 一定要有S不可以乱打

https://ithelp.ithome.com.tw/upload/images/20220204/20119035GxIFDj8GuC.png

assets 档案

https://ithelp.ithome.com.tw/upload/images/20220204/20119035pNy6pKte5r.png

assets 档案--再新增File

https://ithelp.ithome.com.tw/upload/images/20220204/20119035G2XtQeYP7v.png

命名档案不要中文-要加上副档名.json

https://ithelp.ithome.com.tw/upload/images/20220204/20119035DcoqGqA7nK.png

按enter

https://ithelp.ithome.com.tw/upload/images/20220204/20119035jysIIu9yX8.png


开始~
https://ithelp.ithome.com.tw/upload/images/20220204/20119035sSE1c5lDgP.png

开始打入key和value

https://ithelp.ithome.com.tw/upload/images/20220204/20119035r3V02UusdH.png

{
  "no": 1,
  "friends": []
}

加入物件 最後一个没有,

https://ithelp.ithome.com.tw/upload/images/20220204/20119035OIub9yyyc9.png


那3个放在{}阵列里面的属性要一样

KEY不能改: VALUE值可以改

https://ithelp.ithome.com.tw/upload/images/20220204/201190357zMVqgYhMW.png

{
  "no": 1,
  "friends": [
    {"name": "AAAA","phone": "1234567890"},
    {"name": "SONIA","phone": "0987654321"},
    {"name": "ANNY","phone": "13572468"}
  ]
}

回到java档-宣告变数

https://ithelp.ithome.com.tw/upload/images/20220204/20119035f9WlaIY8pg.png

package com.huang.myjson;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {

    //宣告变数

    Context context;
    TextView show;
    JSONObject obj;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onclick(View view) {
    }
}

初始化-

https://ithelp.ithome.com.tw/upload/images/20220204/20119035NfgSCXIE3z.png

package com.huang.myjson;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {

    //宣告变数

    Context context;
    TextView show;
    JSONObject obj;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化
        context = this;
        show = findViewById(R.id.show);

    }

    public void onclick(View view) {
    }
}

在onclick先产生空的暂时的容器+不同来源的取得方式

https://ithelp.ithome.com.tw/upload/images/20220204/20119035XhpasRl9xf.png

package com.huang.myjson;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import org.json.JSONObject;

public class MainActivity extends AppCompatActivity {

    //宣告变数

    Context context;
    TextView show;
    JSONObject obj;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化
        context = this;
        show = findViewById(R.id.show);

    }

    public void onclick(View view) {
        //暂存资料区

        StringBuilder sb = new StringBuilder();
        String all="";

        //Assets资源管理器
        AssetManager manager = context.getAssets();

    }
}

如果要复制贴上
package com.huang.myjson;这句不能贴

//读取JSON档:byte-->char-->String-->一行一行读取

https://ithelp.ithome.com.tw/upload/images/20220204/20119035aLKMFt0Zsn.png

package com.huang.myjson;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

    //宣告变数

    Context context;
    TextView show;
    JSONObject obj;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化
        context = this;
        show = findViewById(R.id.show);

    }

    public void onclick(View view) {
        //暂存资料区
        StringBuilder sb = new StringBuilder();
        String all="";
        //Assets资源管理器
        AssetManager manager = context.getAssets();

        //读取JSON档:byte-->char-->String-->一行一行读取

        BufferedReader br = new BufferedReader(new InputStreamReader(manager.open("myjson.json")));

    }
}

open要抛例外 反红才会消失

https://ithelp.ithome.com.tw/upload/images/20220204/201190356Jg2enc67N.png

目前长这样.顺序不可反
https://ithelp.ithome.com.tw/upload/images/20220204/201190354WUdg6rRUl.png

package com.huang.myjson;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

    //宣告变数

    Context context;
    TextView show;
    JSONObject obj;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化
        context = this;
        show = findViewById(R.id.show);

    }

    public void onclick(View view) {
        //暂存资料区
        StringBuilder sb = new StringBuilder();
        String all="";
        //Assets资源管理器
        AssetManager manager = context.getAssets();

        //读取JSON档:byte-->char-->String-->一行一行读取

        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(manager.open("myjson.json")));
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

https://ithelp.ithome.com.tw/upload/images/20220204/20119035QfPiZb95Wf.png


JSONObject obj;做初始化动作+
https://ithelp.ithome.com.tw/upload/images/20220204/20119035qzt6uGdvBn.png

转成字串 JSONObject会反红是因为要抛例外
https://ithelp.ithome.com.tw/upload/images/20220204/201190353L53pdzZEl.png

长这样

https://ithelp.ithome.com.tw/upload/images/20220204/20119035anS5MDuqgJ.png

package com.huang.myjson;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

    //宣告变数

    Context context;
    TextView show;
    JSONObject obj;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化
        context = this;
        show = findViewById(R.id.show);

    }

    public void onclick(View view) {
        //暂存资料区
        StringBuilder sb = new StringBuilder();
        String all="";
        //Assets资源管理器
        AssetManager manager = context.getAssets();
        try {
            //读取JSON档:byte-->char-->String-->一行一行读取
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(manager.open("myjson.json")));
            //逐行读取并放到StringBuilder中
            String line;
            while ((line=br.readLine())!=null){
                sb.append(line);
            }

            //将字串转成"JSON物件"
            JSONObject allObj = new JSONObject(sb.toString());

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

https://ithelp.ithome.com.tw/upload/images/20220204/20119035qqSu2OSqRN.png


https://ithelp.ithome.com.tw/upload/images/20220204/20119035SbZZZReyLa.png

 JSONObject allObj = new JSONObject(sb.toString());

把准字串转
obj = new JSONObject(sb.toString());


再加入Toast这个又要用手机才可以看到结果

https://ithelp.ithome.com.tw/upload/images/20220204/20119035gX2Q811CUA.png

package com.huang.myjson;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

    //宣告变数

    Context context;
    TextView show;
    JSONObject obj;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化
        context = this;
        show = findViewById(R.id.show);

    }

    public void onclick(View view) {
        //暂存资料区
        StringBuilder sb = new StringBuilder();
        String all="";
        //Assets资源管理器
        AssetManager manager = context.getAssets();
        try {
            //读取JSON档:byte-->char-->String-->一行一行读取
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(manager.open("myjson.json")));
            //逐行读取并放到StringBuilder中
            String line;
            while ((line=br.readLine())!=null){
                sb.append(line);
            }

            //将字串转成"JSON物件"
           obj = new JSONObject(sb.toString());

            //指定要取出的阵列
            JSONArray objArray = obj.getJSONArray("friends");

            //读取里面的东西.把3个name都收起来
            for(int i=0;i< objArray.length();i++){
                JSONObject o=objArray.getJSONObject(i);
                String name = o.getString("name");
                all +=name+"";
            }
            //用文字栏位显示结果 Toast.makeText(context,all,Toast.LENGTH_SHORT).show();
            show.setText(all);

        } catch (IOException | JSONException e) {
            e.printStackTrace();
            Toast.makeText(context,"FAIL",Toast.LENGTH_SHORT).show();
        }
    }
}

抓到3个名字
https://ithelp.ithome.com.tw/upload/images/20220204/20119035F7kXC0hVgu.png

https://ithelp.ithome.com.tw/upload/images/20220204/20119035atAOdrQjgT.png

https://ithelp.ithome.com.tw/upload/images/20220204/20119035lczdfbjXke.png



下周要面试考mysql+C#我应该要来准备的.........最後录取了~只是我不会去

其实非本科面试机会并不会很少~人人有机会

所以这篇还是先纯文字~真拍谢:
/images/emoticon/emoticon06.gif

Andriod环境安装好了之後的步骤:

  1. xml档里面排一些元件:像是按钮等等
  2. Palette元件库-按放大镜搜寻
  3. xml档里面排一些元件:像是按钮等等->Common是我们的结构树:是一层一层关系
  4. Attributes要有东西要点到元件
  5. xml档里面排一些元件id=变数/没有写就是只能看不能被操作/首字要英文
  6. layout=元件在版面上要多高多宽
  7. 0dp的0是弹性/跟着父容器弹性缩放/dp要留着
  8. Constraint=跟谁绑定做移动/有条件
  9. 按X是不绑定=会去依靠有绑定的地方(横的跟直的至少要绑定一个地方)
  10. 4边都是0=自动侦测=就是至中
  11. Common Attributs要显示甚麽字-点large字变大
  12. All Attributs 旧版改字+颜色在下面

因为又开始爱困了~
希望...可以让我继续有铁人发文的机会~拜托拜托


<<:  浅谈档案系统

>>:  Day26 - AlertDialog

Day23 jQuery 基本教学(三)

Method 操作方法 在熟悉 selector 後,就可以开始采用物件连结的方式进行各种作业 最基...

D18-(9/18)-光磊(2340)-智慧手表供应链

注:发文日和截图的日期不一定是同一天,所以价格计算上和当日不同,是很正常的。 声明:这一系列文章并无...

予焦啦!使用 GDB 推进

本节是以 Golang 上游 ee91bb83198f61aa8f26c3100ca7558d30...

【Day 05】format 函式

str.format 是在 python 中常用的字串格式化招式,可以控制想要显示的资料型态、正负号...

[区块链&DAPP介绍 Day6] Solidity 教学 - reference types

昨天看完value types,今天来聊聊 reference types。 solidity 的 ...