• Android进阶之路 - 存、取、读 本地 Json 文件


    最近在开发中又开始加载一些本地的json数据源,回头看之前竟然没记录,赶紧记录一波 ~

    如何准备一个合格的json文件?

    1. 准备一个txt格式的json串,另存为(A)...

    在这里插入图片描述

    1. 更改文件名后缀为json更改编码格式为 UTF-8 - 保存后你就获取到了一个合格的json文件了

    在这里插入图片描述

    题外话 - 此处可不看

    因为我是加载本地的省市区数据(后台提供数据源),无聊的时候github看到个 address.json ,其实意义不大,就顺手记录一下

    在这里插入图片描述


    AndoridStudio中如何存放json文件?

    1. 新建一个 assets 文件夹,将我们生成的json文件放在其内即可
      在这里插入图片描述
    2. 为了直观一点,奉上一张目录结构图
      在这里插入图片描述

    如何读取本地Json文件数据源?

    在我写的Demo示例中,我用到的解析方式是FastJson,以前有写过一篇 Android进阶之路 - FastJson送给如我从前般的新手

    我解析用到的Model类,有兴趣的可以看看,没兴趣跳过就好 - AddressResponse

    package com.defense.myapplication
    
    import java.io.Serializable
    import java.util.*
    
    data class AddressResponse(
        val child: List<Child>,
        val firstLetter: String,
        val level: Int,
        val name: String,
        val parentId: Int,
        val part: Int
    ) {
        data class Child(
            val child: List<ChildX>,
            val firstLetter: String,
            val id: Int,
            val level: Int,
            val name: String,
            val parentId: Int,
            val part: Int
        ) {
            data class ChildX(
                val child: List<Any>,
                val firstLetter: String,
                val id: Int,
                val level: Int,
                val name: String,
                val parentId: Int,
                val part: Int
            )
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    Java 版本
        public void readJson() {
            try {
                //InputStreamReader 将字节输入流转换为字符流
                //注意:address.json 是因人而异的
                InputStreamReader isr = new InputStreamReader(getAssets().open("address.json"), "UTF-8");
                //包装字符流,将字符流放入缓存里
                BufferedReader br = new BufferedReader(isr);
                String line;
                //StringBuilder和StringBuffer功能类似,存储字符串
                StringBuilder builder = new StringBuilder();
                while ((line = br.readLine()) != null) {
                    //append 被选元素的结尾(仍然在内部)插入指定内容,缓存的内容依次存放到builder中
                    builder.append(line);
                }
                br.close();
                isr.close();
                
                //builder.toString() 返回表示此序列中数据的字符串 (就是json串,后面自行解析就行)
                //这里我用的是fastJson,具体解析方式自行决定就好,数据格式也自行决定就好
                List<AddressResponse> addressResponses = JSON.parseArray(builder.toString(), AddressResponse.class);
                for (int i = 0; i < addressResponses.size(); i++) {
                    AddressResponse addressResponse = addressResponses.get(i);
                    System.out.println("-----------------");
                    System.out.println("name= " + addressResponse.getName());
                    List<AddressResponse.Child> child = addressResponse.getChild();
                    for (int j = 0; j < child.size(); j++) {
                        System.out.println("city name= " + child.get(j).getName());
                    }
                }         
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    Kotlin 版本
    1. 因为项目中使用,所以稍微优化一下,先检查 assets是否有对应的json文件
        public static String readAssetsFile(Context context, String fileName) {
            try {
                InputStream is = context.getAssets().open(fileName);
                int fileLength = is.available();
                byte[] buffer = new byte[fileLength];
                int readLength = is.read(buffer);
                is.close();
                return new String(buffer, "utf-8");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return "读取错误,请检查文件是否存在";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    1. 获取json文件后,直接解析到我们需要的数据源
        public static List<AddressResponse> getLocalAddress(String json) {
            List<AddressResponse> addressResponses = JSON.parseArray(json, AddressResponse.class);
            return addressResponses;
        }
    
    • 1
    • 2
    • 3
    • 4
    1. 调用方式
      lateinit var localAddressList: ArrayList<AddressResponse>
    
      localAddressList = getLocalAddress(
                readAssetsFile(
                    this,
                    "address.json"
                )
            ) as ArrayList<AddressResponse>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    有的人可能感觉麻烦,我直接简单封在一起吧

    未亲测 - 不过感觉没啥问题

      lateinit var localAddressList: ArrayList<AddressResponse>
      localAddressList = getLocalAddress(
                readAssetsFile(
                    this,
                    "address.json"
                )
            ) as ArrayList<AddressResponse>
    	
    	//判断文件+解析
    	public static List<AddressResponse> readAssetsFile(Context context, String fileName) {
            try {
                InputStream is = context.getAssets().open(fileName);
                int fileLength = is.available();
                byte[] buffer = new byte[fileLength];
                int readLength = is.read(buffer);
                is.close();
                
                List<AddressResponse> addressResponses = JSON.parseArray(new String(buffer, "utf-8"), AddressResponse.class);
           	 	return addressResponses;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return "读取错误,请检查文件是否存在";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • 相关阅读:
    六、扩充 gamma校正流程
    第2-3-6章 打包批量下载附件的接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss
    按钮只能点击一次
    在linux安装单机版hadoop-3.3.6
    idea灰屏问题
    安全狗“指南” | XDM,收好这份攻防演练“摸鱼指南”
    res.add(new ArrayList<>(path))和res.add(path)的区别
    期货开户服从命令不抱幻想
    RabbitMQ系列【16】AmqpTemplate接口详解
    大话CAS
  • 原文地址:https://blog.csdn.net/qq_20451879/article/details/126020170