安卓案例:读取与解析JSON
一、运行效果
先单击【解析JSON】按钮,会弹出吐司提示用户先读取Json文件:
单击【读取JSON】按钮:
单击【解析JSON】按钮:
二、实现步骤
1、创建安卓应用ParseJson
2、切换到Project视图,在main目录下创建assets目录
将项目切换回Android视图:
3、在assets目录下创建test.json文件
[
{
"id": 1,
"name": "计算机基础教程",
"press": "清华大学出版社",
"author": "李晓云",
"price": 30.5
},
{
"id": 2,
"name": "Java程序设计",
"press": "水利水电出版社",
"author": "张国锋",
"price": 40
},
{
"id": 3,
"name": "安卓应用开发",
"press": "北京大学出版社",
"author": "郑晓华",
"price": 60.5
},
{
"id": 4,
"name": "PHP应用开发教程",
"press": "南京大学出版社",
"author": "滕玉国",
"price": 27.5
}
]
4、主布局文件activity_main.xml
5、字符串资源文件strings.xml
读取与解析JSON
读取JSON
解析JSON
6、修改模块的build.gradle文件,添加依赖
7、主界面类MainActivity
package net.hw.parse_json;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.apache.http.util.EncodingUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.io.InputStream;
/**
* Created by howard on 2018/3/14.
*/
public class MainActivity extends Activity {
/**
* 文件内容字符串
*/
private String content;
/**
* 文件内容标签
*/
private TextView tvContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 利用布局资源文件设置用户界面
setContentView(R.layout.activity_main);
// 通过资源标识获得控件实例
tvContent = findViewById(R.id.tv_content);
}
/**
* 读取Json文件
*
* @param view
*/
public void doReadJson(View view) {
try {
// 读取assets目录里的test.json文件,获取字节输入流
InputStream is = getResources().getAssets().open("test.json");
// 获取字节输入流长度
int length = is.available();
// 定义字节缓冲区
byte[] buffer = new byte[length];
// 读取字节输入流,存放到字节缓冲区里
is.read(buffer);
// 将字节缓冲区里的数据转换成utf-8字符串
content = EncodingUtils.getString(buffer, "utf-8");
// 将字符串显示在标签里
tvContent.setText(content);
// 设置标签文本颜色
tvContent.setTextColor(Color.BLUE);
// 关闭输入流
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 解析Json
*
* @param view
*/
public void doParseJson(View view) {
// 判断用户是否读取了Json文件
if (content == null) {
Toast.makeText(this, "请先读取Json文件!", Toast.LENGTH_SHORT).show();
} else {
try {
// 清空标签内容
tvContent.setText("");
// 基于content字符串创建Json数组
JSONArray jsonArray = new JSONArray(content);
// 遍历Json数组
for (int i = 0; i < jsonArray.length(); i++) {
// 通过下标获取json数组元素——Json对象
JSONObject jsonObject = jsonArray.getJSONObject(i);
// 对Json对象按键取值
int id = jsonObject.getInt("id");
String name = jsonObject.getString("name");
String press = jsonObject.getString("press");
String author = jsonObject.getString("author");
double price = jsonObject.getDouble("price");
// 拼接成一本图书信息
String book = "编号:" + id
+ "\n书名:" + name
+ "\n出版社:" + press
+ "\n作者:" + author
+ "\n单价:" + price + "\n\n";
// 将图书信息追加到标签里
tvContent.append(book);
}
// 设置标签文本颜色
tvContent.setTextColor(Color.RED);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
8、运行程序,查看效果
先单击【解析JSON】按钮,会弹出吐司提示用户先读取Json文件:
单击【读取JSON】按钮:
单击【解析JSON】按钮:
三、课堂练习
1、修改读取JSON按钮的单击事件处理代码,要求采用缓冲输入流BufferReader来读取json文件。
2、编写一个解析Json字符串的安卓程序,界面包含一个编辑框、一个按钮和一个标签,编辑框用于输入Json字符串,单击按钮,将解析的内容显示在标签里。