JSON是JavaScript对象表示法,他和XML差不多,但是比XML更小、更快、更易解析。今天用JSONObject对其进行了创建和解析的实验。JSON数据是由对象或数组组成的,对象里面的数据是以键值对的方式存在的,而数组里面可以存放着很多的对象。
实验要求,创建以下的JSON数据并对其进行解析显示到TextView组件中:
{
"cat":"it",
"languages":[
{"id":1,"ide":"Eclipse","name":"Java"},
{"id":2,"ide":"XCode","name":"Swift"},
{"id":3,"ide":"Visual Studio","name":"C#"}
]
}
效果图:
下面先创建一个空的项目,然对activity_main.xml和MainActivity.java进行编辑
activity_main.xml代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.oak.d4_json.MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="创建"
android:id="@+id/bt_create"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="读取"
android:id="@+id/bt_read"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv"/>
</LinearLayout>
MainActivity.java代码:
package com.oak.d4_json;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
public class MainActivity extends AppCompatActivity {
private Button bt_create;//声明创建按钮组件变量
private Button bt_read;//声明读取按钮组件变量
private File file;//声明一个文件对象
private TextView tv;//声明TextView组件变量
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_create = (Button) findViewById(R.id.bt_create);//获取到创建按钮组件
bt_read = (Button) findViewById(R.id.bt_read);//获取到读取按钮组件
tv = (TextView) findViewById(R.id.tv);//获取到TextView组件
file = new File(getFilesDir(),"Test.json");//获取到应用在内部的私有文件夹下对应的Test.json文件
bt_create.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
JSONObject root = new JSONObject();//实例一个JSONObject对象
root.put("cat","it");//对其添加一个数据
JSONArray languages = new JSONArray();//实例一个JSON数组
JSONObject lan1 = new JSONObject();//实例一个lan1的JSON对象
lan1.put("id",1);//对lan1对象添加数据
lan1.put("ide","Eclipse");//对lan1对象添加数据
lan1.put("name","Java");//对lan1对象添加数据
JSONObject lan2 = new JSONObject();//实例一个lan2的JSON对象
lan2.put("id",2);//对lan2对象添加数据
lan2.put("ide","XCode");//对lan2对象添加数据
lan2.put("name","Swift");//对lan2对象添加数据
JSONObject lan3 = new JSONObject();//实例一个lan3的JSON对象
lan3.put("id",3);//对lan3对象添加数据
lan3.put("ide","Visual Studio");//对lan3对象添加数据
lan3.put("name","C#");//对lan3对象添加数据
languages.put(0,lan1);//将lan1对象添加到JSON数组中去,角标为0
languages.put(1,lan2);//将lan2对象添加到JSON数组中去,角标为1
languages.put(2,lan3);//将lan3对象添加到JSON数组中去,角标为2
root.put("languages",languages);//然后将JSON数组添加到名为root的JSON对象中去
FileOutputStream fos = new FileOutputStream(file);//创建一个文件输出流
fos.write(root.toString().getBytes());//将生成的JSON数据写出
fos.close();//关闭输出流
Toast.makeText(getApplicationContext(),"创建成功!",Toast.LENGTH_SHORT).show();
} catch (JSONException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
bt_read.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
FileInputStream fis = new FileInputStream(file);//获取一个文件输入流
InputStreamReader isr = new InputStreamReader(fis);//读取文件内容
BufferedReader bf = new BufferedReader(isr);//将字符流放入缓存中
String line;//定义一个用来临时保存数据的变量
StringBuilder sb = new StringBuilder();//实例化一个字符串序列化
while((line = bf.readLine()) != null){
sb.append(line);//将数据添加到字符串序列化中
}
//关闭流
fis.close();
isr.close();
bf.close();
JSONObject root = new JSONObject(sb.toString());//用JSONObject进行解析
String cat = root.getString("cat");//获取字符串类型的键值对
tv.append("cat"+"="+cat+"\n");//显示数据
tv.append("---------------"+"\n");//分割线
JSONArray array = root.getJSONArray("languages");//获取JSON数据中的数组数据
for (int i=0; i<array.length(); i++){
JSONObject object = array.getJSONObject(i);//遍历得到数组中的各个对象
int id = object.getInt("id");//获取第一个值
String ide = object.getString("ide");//获取第二个值
String name = object.getString("name");//获取第三个值
tv.append("id"+"="+id+"\n");//显示数据
tv.append("ide"+"="+ide+"\n");//显示数据
tv.append("name"+"="+name+"\n");//显示数据
tv.append("---------------"+"\n");//分割线
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
}
到这里简单对JSON数据的操作就已经完成了,如果还有童鞋不懂的可以私聊我或者留言,我会第一时间回复的。分享是一种美德,我每天都在做。
By:Brycen Liu