栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

        • 如何准备一个合格的json文件?
        • AndoridStudio中如何存放json文件?
        • 如何读取本地Json文件数据源?
          • Java 版本
          • Kotlin 版本

如何准备一个合格的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,
    val firstLetter: String,
    val level: Int,
    val name: String,
    val parentId: Int,
    val part: Int
) {
    data class Child(
        val child: List,
        val firstLetter: String,
        val id: Int,
        val level: Int,
        val name: String,
        val parentId: Int,
        val part: Int
    ) {
        data class ChildX(
            val child: List,
            val firstLetter: String,
            val id: Int,
            val level: Int,
            val name: String,
            val parentId: Int,
            val part: Int
        )
    }
}
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 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 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();
        }
    }
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. 获取json文件后,直接解析到我们需要的数据源
    public static List getLocalAddress(String json) {
        List addressResponses = JSON.parseArray(json, AddressResponse.class);
        return addressResponses;
    }
  1. 调用方式
  lateinit var localAddressList: ArrayList

  localAddressList = getLocalAddress(
            readAssetsFile(
                this,
                "address.json"
            )
        ) as ArrayList

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

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

  lateinit var localAddressList: ArrayList
  localAddressList = getLocalAddress(
            readAssetsFile(
                this,
                "address.json"
            )
        ) as ArrayList
	
	//判断文件+解析
	public static List 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 addressResponses = JSON.parseArray(new String(buffer, "utf-8"), AddressResponse.class);
       	 	return addressResponses;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "读取错误,请检查文件是否存在";
    }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1031846.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号