SON(JavaScript Object Notation)
是一种轻量级的数据交换格式.它基于ECMAScript的一个子集.JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等),
这些特性使JSON成为理想的数据交换语言,易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率).
JSON的数据格式(有四种格式)
{“品名”:”无人机”,”等级”:”一级”,”重量”:”1kg”}
{“品名”:”无人机”,”等级”:”一级”,”重量”:”1kg”},{“品名”:”机器人”,”产地”:”中国”}
{ “产品”:[{“品名”:”无人机”,”等级”:”一级”,”重量”:”1kg”},{“品名”:”机器人”,”产地”:”中国”}]}
var shp={“品名”:”无人机”,”等级”:”一级”,”重量”:”1kg”}
UI实现:以两个EditText做用户输入,创建3个按键,一个按键用于添加用户数据 一个按键用于保存为JSON格式数据 一个按键用于读取JSON格式数据
代码流程:用安卓JsonWriter把数据存储为json格式
零.用户添加数据
一.调用输出流输出数据
二.调用安卓JsonWriter输出流
三.开始写json格式
四.放入参数名和参数值
五.结束写json格式
六.关闭输出流
代码:
//在MainActivity
public class MainActivity extends Activity {
//用于得到用户输入的数据
private EditText typeEdit;
private EditText pmerEdit;
//创建一个ArrayList用于存放数据
private static ArrayList<Product> pro = new ArrayList<Product>();
private String path = android.os.Environment.getExternalStorageDirectory()+"/json.json";
//Product类为数据类,里面有两个参数,一个是输入数据的品名,一个数据的值
public class Product{
String type;
String pmer;
public Product(String type,String pmer){
this.type = type;
this.pmer = pmer;
}
}
//添加数据按键事件
public void addDataOnClick(View v) throws IOException {
//得到UI的两个控件,并得到用户输入的数据
typeEdit = (EditText) findViewById(R.id.typeEdit);
pmerEdit = (EditText) findViewById(R.id.pmerEdit);
String type = typeEdit.getText().toString();
String pmer = pmerEdit.getText().toString();
//调用输入流读数据
FileInputStream in = new FileInputStream(path);
InputStreamReader inRead = new InputStreamReader(in,"utf-8");
//调用安卓JsonReader输入流
JsonReader jr = new JsonReader(inRead);
//开始读json格式 //如果读的数据是"{",就调用reader.beginObject(); "{ }"保存的是非数组数据,“[ ]”保存的是数组数据;
//如果读的数据是"[",就调用reader.beginArray();
jr.beginArray();
while (jr.hasNext()){ //循环读取每个内容(这个循环是用于防止程序关闭后再打开,会把原来的数据替换,用户读取以前保存好的数据)
String type1=null; //用于临时存放读取到的值
String pmer1=null;
jr.beginObject();
while (jr.hasNext()){ //循环读取每个内容
String name = jr.nextName(); //获得参数名
if(name.equals("Value Type")){ //如果参数名=Value Type
type1 = jr.nextString(); //就获得编号的值
}
else if(name.equals("Parameter")){ //如果参数名=Parameter,就获得名称的值.
pmer1 = jr.nextString(); //可以使用jr.skipValue();做忽略,如果不需要这个参数名
}
}
jr.endObject(); //结束读json格式
pro.add(new Product(type1,pmer1)); //然后创建一个Product类,把读取到的数据存进去,添加到list里
}
jr.endArray(); //结束读json格式
pro.add(new Product(type, pmer)); //添加用户输入的新数据
Toast.makeText(getApplicationContext(),"Add Success!!",Toast.LENGTH_SHORT).show();//提示一下
}
//要注意:每一层“{ }”或“[ ]”都要用while(reader.hasNext){}循环读取,有几层就用几个.
//数据存储为json格式按键事件
public void saveDataOnClick(View v) throws IOException {
//调用输出流输出数据
FileOutputStream out = new FileOutputStream(path);
OutputStreamWriter outWri = new OutputStreamWriter(out,"utf-8");
//调用安卓JsonWriter输出流
JsonWriter jw = new JsonWriter(outWri);
//开始写json格式
jw.beginArray();
//放入参数名和参数值
for(Product p:pro){
jw.beginObject();
jw.name("Value Type").value(p.type);
jw.name("Parameter").value(p.pmer);
jw.endObject();
}
//结束写json格式
jw.endArray();
//关闭输出流
outWri.flush();
jw.close();
//提示
Toast.makeText(getApplicationContext(),"Save Success!!",Toast.LENGTH_SHORT).show();
}
代码流程:用安卓JsonReader读取json格式的数据
一.调用输入流读数据
二.调用安卓JsonReader输入流
三.开始读json格式
四.读内容(while循环)
五.结束读json格式
六.处理读取的数据
七.关闭输入流
代码
//读取json格式的数据按键事件(和添加数据里的读取已经保存的数据的代码是一样的)
public void readJsonOnClick(View v) throws IOException {
ArrayList<Product> list = new ArrayList<Product>();
FileInputStream in = new FileInputStream(path);
InputStreamReader inRead = new InputStreamReader(in,"utf-8");
JsonReader jr = new JsonReader(inRead);
jr.beginArray();
while (jr.hasNext()){
String type=null;
String pmer=null;
jr.beginObject();
while (jr.hasNext()){
String name = jr.nextName();
if(name.equals("Value Type")){
type = jr.nextString();
}
else if(name.equals("Parameter")){
pmer = jr.nextString();
}
}
jr.endObject();
list.add(new Product(type,pmer));
}
jr.endArray();
//处理读取的数据
String ss="";
for (Product p:list){
ss+="Value Type: "+p.type+" Parameter: "+p.pmer+"\n";
}
Toast.makeText(getApplicationContext(),ss,Toast.LENGTH_LONG).show();
jr.close();
}