JSON数据解析(5)
之前我们都是解析XML文件,虽然规范化了文件传输的定义格式,但是大家有没有意识到每次传输前都要进行元素声明,这样传输中将传出很多无用数据,导致传输数据量增大,而且解析xml操作很复杂,作者在之前编程中也几近崩溃,现在我们介绍一种轻量级的数据交换格式--JSON
JSON将对象中数据转化为字符串。在应用程序中传递,最重要的是在异步系统中进行服务器和客户端之间的数据传递,这里将在网络连接课程讲到,利用JSON解析打包发送手机端数据给服务器。
{
"code":"状态码",
"message":"返回信息/错误信息",
"result":{
"user_id":"用户ID"
}
}
JSON结构是由外向内读
有点想数据库结构,先从spj读起,再访问子类
一个外部JSONObject保存多个字符串信息例如name,address,telephone和一个JSONArray对象
一个JSONArray对象保存多个JSONObject对象
每一个保存在JSONArray下的JSONObject保存多种数据类型。
现在将数据写入文档
Activity文件
public class MainActivity extends Activity { private String nameData[] = new String[] { "张依依", "蓝杰培训", "lanjie" }; private int ageData[] = new int[] { 30, 5, 7 }; private boolean isMarraiedData[] = new boolean[] { false, true, false }; private double salaryData[] = new double[] { 3000.0, 5000.0, 9000.0 }; private Date birthdayData[] = new Date[] { new Date(), new Date(), new Date() }; private String companyName = "湖南大学(信息科学与工程学院)" ; private String companyAddr = "长沙市岳麓区麓山南路453" ; private String companyTel = "13283928931" ; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.activity_main); JSONObject allData = new JSONObject(); // 建立最外面的节点对象 JSONArray sing = new JSONArray(); // 定义数组 for (int x = 0; x < this.nameData.length; x++) { // 将数组内容配置到相应的节点 JSONObject temp = new JSONObject(); // 每一个包装的数据都是JSONObject try { temp.put("name", this.nameData[x]);//一个键对应相应数值 temp.put("age", this.ageData[x]); temp.put("married", this.isMarraiedData[x]); temp.put("salary", this.salaryData[x]); temp.put("birthday", this.birthdayData[x]); } catch (JSONException e) { e.printStackTrace(); } sing.put(temp); // 保存多个JSONObject } try { allData.put("persondata", sing); allData.put("company", this.companyName) ; allData.put("address", this.companyAddr) ; allData.put("telephone", this.companyTel) ; } catch (JSONException e) { e.printStackTrace(); } if (!Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { // 不存在不操作 return; // 返回到程序的被调用处 } File file = new File(Environment.getExternalStorageDirectory() + File.separator + "eedata" + File.separator + "json.txt"); // 要输出文件的路径 if (!file.getParentFile().exists()) { // 文件不存在 file.getParentFile().mkdirs(); // 创建文件夹 } PrintStream out = null; try { out = new PrintStream(new FileOutputStream(file)); out.print(allData.toString()); // 将数据变为字符串后保存 } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (out != null) { out.close(); // 关闭输出 } } } }
然后在相应路径找到文件json.txt显示如下:
接下来我们要试着把json文件解析出来
首先布局文件定义:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/msg" android:layout_width="fill_parent" android:layout_height="wrap_content"/> </LinearLayout>
Activity JSON解析
public class MainActivity extends Activity { private TextView msg = null ; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.activity_main); this.msg = (TextView) super.findViewById(R.id.msg) ; String str = "[{\"id\":1,\"name\":\"张依依\",\"age\":21}," + "{\"id\":2,\"name\":\"lanjie\",\"age\":10}]"; StringBuffer buf = new StringBuffer() ; try { List<Map<String,Object>> all = this.parseJson(str) ;//json解析文本格式 Iterator<Map<String,Object>> iter = all.iterator() ; while(iter.hasNext()){ Map<String,Object> map = iter.next() ; buf.append("ID:" + map.get("id") + ",姓名:" + map.get("name") + ",年龄:" + map.get("age") + "\n"); } } catch (Exception e) { e.printStackTrace(); } this.msg.setText(buf) ; } private List<Map<String, Object>> parseJson(String data) throws Exception { List<Map<String, Object>> all = new ArrayList<Map<String, Object>>(); JSONArray jsonArr = new JSONArray(data); // 是数组 for (int x = 0; x < jsonArr.length(); x++) { Map<String, Object> map = new HashMap<String, Object>(); JSONObject jsonObj = jsonArr.getJSONObject(x); map.put("id", jsonObj.getInt("id")); map.put("name", jsonObj.getString("name")); map.put("age", jsonObj.getInt("age")); all.add(map); } return all; } }
实现效果如图: