最近在开发中又开始加载一些本地的json数据源,回头看之前竟然没记录,赶紧记录一波 ~
- 如何准备一个合格的json文件?
- AndoridStudio中如何存放json文件?
- 如何读取本地Json文件数据源?
- Java 版本
- Kotlin 版本
- 准备一个txt格式的json串,另存为(A)...
- 更改文件名后缀为json、更改编码格式为 UTF-8 - 保存后你就获取到了一个合格的json文件了
题外话 - 此处可不看
因为我是加载本地的省市区数据(后台提供数据源),无聊的时候github看到个 address.json ,其实意义不大,就顺手记录一下
AndoridStudio中如何存放json文件?
- 新建一个 assets 文件夹,将我们生成的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,
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 版本
- 因为项目中使用,所以稍微优化一下,先检查 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 "读取错误,请检查文件是否存在";
}
- 获取json文件后,直接解析到我们需要的数据源
public static ListgetLocalAddress(String json) { List addressResponses = JSON.parseArray(json, AddressResponse.class); return addressResponses; }
- 调用方式
lateinit var localAddressList: ArrayListlocalAddressList = getLocalAddress( readAssetsFile( this, "address.json" ) ) as ArrayList
有的人可能感觉麻烦,我直接简单封在一起吧
未亲测 - 不过感觉没啥问题
lateinit var localAddressList: ArrayListlocalAddressList = 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 "读取错误,请检查文件是否存在"; }



