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

这篇具有很好参考价值的文章主要介绍了Android进阶之路 - 存、取、读 本地 Json 文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

如何准备一个合格的json文件?
  1. 准备一个txt格式的json串,另存为(A)...

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

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

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

题外话 - 此处可不看

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

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


AndoridStudio中如何存放json文件?
  1. 新建一个 assets 文件夹,将我们生成的json文件放在其内即可
    Android进阶之路 - 存、取、读 本地 Json 文件
  2. 为了直观一点,奉上一张目录结构图
    Android进阶之路 - 存、取、读 本地 Json 文件

如何读取本地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
        )
    }
}
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();
        }
    }
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<AddressResponse> getLocalAddress(String json) {
        List<AddressResponse> addressResponses = JSON.parseArray(json, AddressResponse.class);
        return addressResponses;
    }
  1. 调用方式
  lateinit var localAddressList: ArrayList<AddressResponse>

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

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

未亲测 - 不过感觉没啥问题文章来源地址https://www.toymoban.com/news/detail-428281.html

  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 "读取错误,请检查文件是否存在";
    }

到了这里,关于Android进阶之路 - 存、取、读 本地 Json 文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android-高级-UI-进阶之路(四)-Paint-渲染-滤镜-xfermode-使用

    class MyGradientView : View { private var mPaint: Paint? = null private var mBitMap: Bitmap? = null private var mWidth: Int = 0 private var mHeight: Int = 0 private val mColors = intArrayOf(Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW) constructor(context: Context?) : super(context) { init() } constructor(context: Context?, attrs: AttributeSet?) : super(

    2024年04月16日
    浏览(44)
  • Android-高级-UI-进阶之路-(七)-SVG-基础使用-+-绘制中国地图

    输入搜索动画 利用在线绘制 SVG 图标网站 制作搜索图标 可以自己随意捣鼓绘制,绘制好了之后点击视图-源代码,将 SVG 代码复制出来保存成 search_svg.xml 在线转换 svg2vector 点击空白或者直接将 SVG 拖拽指定区域进行转换 将转换好的 Android 格式的 vector 导入 AS 开始制作动画关联

    2024年03月20日
    浏览(54)
  • Android高级UI进阶之路(七)——SVG基础使用(绘制中国地图)

    Android高级UI进阶之路(一) —— View的基础知识 Android高级UI进阶之路(二) —— 深入理解Android8.0 View的触摸事件分发机制 Android高级UI进阶之路(三) —— 理解View的工作原理及自定义View入门 Android高级UI进阶之路(四) —— Paint渲染滤镜xfermode使用 Android高级UI进阶之路(五) —— Canva

    2024年02月05日
    浏览(38)
  • JS 变量保存为本地json文件,读取本地json文件为变量

    一、变量保存为本地json文件: 第一步:把返回的数据转成json格式                  var content = json.stringify(data); 第二步:把转成blob这种格式                var blob = new blob([content], {type: \\\"text/plain;charset=utf-8\\\"}); 第三步:调用保存 saveas  和文件名字               

    2024年02月08日
    浏览(61)
  • Android-高级-UI-进阶之路-(二)-深入理解-Android-8-0-View-触摸事件分发机制,查漏补缺

    我们看到内部又调用了父类 dispatchTouchEvent 方法, 所以最终是交给 ViewGroup 顶级 View 来处理分发了。 顶级 View 对点击事件的分发过程 在上一小节中我们知道了一个事件的传递流程,这里我们就大致在回顾一下。首先点击事件到达顶级 ViewGroup 之后,会调用自身的 dispatchTouchE

    2024年04月14日
    浏览(70)
  • Android-高级-UI-进阶之路-(五)-看完该篇文章-Canvas-你应该会了

    /** 1. 绘制椭圆 */ canvas.drawOval(RectF(100f,500f,600f,800f),mPaint) /** 2. 绘制圆 */ mPaint.setColor(Color.YELLOW) mPaint.alpha = 100 canvas.drawCircle(400f,400f,200f,mPaint) 绘制 Bitmap // val bitmap = BitmapFactory.decodeResource(context.resources, R.mipmap.gild_3) //第二个,第三个参数代表起点位置 canvas.drawBitmap(bitmap,100f,100

    2024年03月28日
    浏览(56)
  • 045:Vue读取本地上传JSON文件,导出JSON文件方法

    第045个 查看专栏目录: VUE ------ element UI 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使用,computed,watch,生命周期(beforeCreate,created,beforeMount,mounted, beforeUpdate,upda

    2024年02月04日
    浏览(71)
  • Unity中级客户端开发工程师的进阶之路

    上期 UWA技能成长系统 之《Unity高级客户端开发工程师的进阶之路》得到了很多Unity开发者的肯定。通过系统的学习,可以掌握游戏性能瓶颈定位的方法和常见的CPU、GPU、内存相关的性能优化方法。 UWA技能成长系统是UWA根据学员的职业发展目标,提供技能学习的推荐路径,再将

    2024年02月12日
    浏览(51)
  • Android-高级-UI-进阶之路-(七)-SVG-基础使用-+-绘制中国地图,Android面试中常问的MMAP到底是啥东东

    iv.setImageDrawable(animatedVectorDrawable) val animatable = iv.drawable as Animatable animatable.start() } } 输入搜索动画 利用在线绘制 SVG 图标网站 制作搜索图标 可以自己随意捣鼓绘制,绘制好了之后点击视图-源代码,将 SVG 代码复制出来保存成 search_svg.xml 在线转换 svg2vector 点击空白或者直接将

    2024年04月25日
    浏览(50)
  • vue3-访问本地json文件

    将json文件放在public文件夹中(json文件要以英文命名)  用fetch可以直接访问public下的文件

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包