最近在开发中又开始加载一些本地的json数据源,回头看之前竟然没记录,赶紧记录一波 ~
- 如何准备一个合格的json文件?
- AndoridStudio中如何存放json文件?
- 如何读取本地Json文件数据源?
- Java 版本
- Kotlin 版本
如何准备一个合格的json文件?
- 准备一个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<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 版本
- 因为项目中使用,所以稍微优化一下,先检查
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 List<AddressResponse> getLocalAddress(String json) {
List<AddressResponse> addressResponses = JSON.parseArray(json, AddressResponse.class);
return addressResponses;
}
调用方式
lateinit var localAddressList: ArrayList<AddressResponse>
localAddressList = getLocalAddress(
readAssetsFile(
this,
"address.json"
)
) as ArrayList<AddressResponse>
有的人可能感觉麻烦,我直接简单封在一起吧
未亲测 - 不过感觉没啥问题
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 "读取错误,请检查文件是否存在";
}