JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言,尤其在智能手机客户端与服务器网络交互中。
JSON建构于两种结构:
“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
JSON具有以下这些形式:
1.对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔。
2.数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
3.值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
4.字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。字符串(string)与C或者Java的字符串非常相似。
5.数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
我们主要操作的是json object和json array 。
json示例:
{“1”:“one”,“2”:“two”,“3”:“three”}
而
[
{“城市”:“北京”,“面积”:16800,“人口”:1600},
{“城市”:“上海”,“面积”:6400,“人口”:1800}]
简化后成为了:
[
[“北京”,16800,1600],
[“上海”,6400,1800]
]
org.json包中的两个类:
org.json.JSONObject 是JSON定义的基本单元,主要包含的就是一对(key/value)的值,与Map的保存结构类似,是使用“{}”括起来的一组数据,例如:“{key,value}”或 “{key,[数值1,数值2,数值3]}”
org.json.JSONArray 代表一种有序的数值,可以将对象的信息变为字符串,所有的数据都是用“[]”包裹,数值之间以“,”分隔,例如:“[数值1,数值2,数值3]”
代码1:
package org.lxh.demo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MyJSONDemo extends Activity {
private TextView msg = null; // 文本显示组件
@SuppressWarnings("unchecked")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main); // 调用布局管理器
this.msg = (TextView) super.findViewById(R.id.msg); // 取得组件
String str = "{\"memberdata\":"
+ "[{\"id\":1,\"name\":\"李兴华\",\"age\":30},"
+ "{\"id\":2,\"name\":\"MLDN\",\"age\":10}],"
+ "\"company\":\"北京魔乐科技软件学院\"}"; // 解析数据
StringBuffer buf = new StringBuffer(); // 保存数据
try {
Map<String,Object> result = this.parseJson(str) ; // JSON解析
buf.append("公司名称:" + result.get("company") + "\n") ; // 取出信息
List<Map<String, Object>> all = (List<Map<String, Object>>) result
.get("memberdata"); // 取出数据
Iterator<Map<String, Object>> iter = all.iterator(); // 实例化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); // 设置显示文字
}
public Map<String,Object> parseJson(String data) throws Exception {
Map<String, Object> allMap = new HashMap<String, Object>();
JSONObject allData = new JSONObject(data) ; // 定义JSONObject
allMap.put("company", allData.getString("company")) ; // 取出并设置company
JSONArray jsonArr = allData.getJSONArray("memberdata") ; // 取出JSONArray
List<Map<String, Object>> all = new ArrayList<Map<String, Object>>();
for (int x = 0; x < jsonArr.length(); x++) { // 取出数组中的每一个JSONObject
Map<String, Object> map = new HashMap<String, Object>(); // 保存每一组信息
JSONObject jsonObj = jsonArr.getJSONObject(x); // 取得每一个JSONObject
map.put("id", jsonObj.getInt("id")); // 取出并保存id内容
map.put("name", jsonObj.getString("name")); // 取出并保存name内容
map.put("age", jsonObj.getInt("age")); // 取出并保存age内容
all.add(map); // 向集合中保存
}
allMap.put("memberdata", all) ; // 保存集合
return allMap; // 返回全部记录
}
}
代码2:
package org.lxh.demo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MyJSONDemo extends Activity {
private TextView msg = null; // 文本显示组件
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main); // 调用布局管理器
this.msg = (TextView) super.findViewById(R.id.msg); // 取得组件
String str = "[{\"id\":1,\"name\":\"李兴华\",\"age\":30},"
+ "{\"id\":2,\"name\":\"MLDN\",\"age\":10}]"; // 定义JSON数据
StringBuffer buf = new StringBuffer(); // 保存数据
try {
List<Map<String, Object>> all = this.parseJson(str); // 解析JSON文本
Iterator<Map<String, Object>> iter = all.iterator(); // 实例化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); // 设置显示文字
}
public List<Map<String, Object>> parseJson(String data) throws Exception {
List<Map<String, Object>> all = new ArrayList<Map<String, Object>>();
JSONArray jsonArr = new JSONArray(data); // 定义JSON数组
for (int x = 0; x < jsonArr.length(); x++) { // 取出数组中的每一个JSONObject
Map<String, Object> map = new HashMap<String, Object>(); // 保存每一组信息
JSONObject jsonObj = jsonArr.getJSONObject(x); // 取得每一个JSONObject
map.put("id", jsonObj.getInt("id")); // 取出并保存id内容
map.put("name", jsonObj.getString("name")); // 取出并保存name内容
map.put("age", jsonObj.getInt("age")); // 取出并保存age内容
all.add(map); // 向集合中保存
}
return all; // 返回全部记录
}
}
代码3:
package org.lxh.demo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
public class MyJSONDemo extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String data[] = { "www.mldnjava.cn", "lixinghua", "bbs.mldn.cn" }; // 默认的信息
JSONObject allData = new JSONObject(); // 先建立最外面的alldata对象
JSONArray sing = new JSONArray(); // 定义新的JSONArray对象
for (int x = 0; x < data.length; x++) {
JSONObject temp = new JSONObject(); // 创建一个新的JSONObject
try {
temp.put("myurl", data[x]); // 设置要保存的数据
} catch (JSONException e) {
e.printStackTrace();
}
sing.put(temp); // 保存一个信息
}
try {
allData.put("urldata", sing); // 保存所有的数据
} catch (JSONException e) {
e.printStackTrace();
}
if(!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)){ // 如果sdcard不存在
return ; // 返回被调用处
}
File file = new File(Environment
.getExternalStorageDirectory().toString()
+ File.separator
+ "mldndata" + File.separator + "json.txt") ; // 定义File类对象
if (! file.getParentFile().exists()) { // 父文件夹不存在
file.getParentFile().mkdirs() ; // 创建文件夹
}
PrintStream out = null ; // 打印流
try {
out = new PrintStream(new FileOutputStream(file)); // 实例化打印流对象
out.print(allData.toString()) ; // 输出数据
} catch (Exception e) {
e.printStackTrace() ;
} finally {
if (out != null) {
out.close() ; // 关闭打印流
}
}
}
}
代码4:
package org.lxh.demo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Date;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
public class MyJSONDemo extends Activity {
private String nameData[] = new String[] { "李兴华", "魔乐科技", "MLDN" }; // 姓名数据
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 = "北京魔乐科技软件学院(MLDN软件实训中心)" ; // 公司名称
private String companyAddr = "北京市西城区美江大厦6层" ; // 公司地址
private String companyTel = "010-51283346" ; // 公司电话
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
JSONObject allData = new JSONObject(); // 先建立最外面的alldata对象
JSONArray sing = new JSONArray(); // 定义新的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); // 保存一组信息
}
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)){ // 如果sdcard不存在
return ; // 返回被调用处
}
File file = new File(Environment
.getExternalStorageDirectory().toString()
+ File.separator
+ "mldndata" + File.separator + "json.txt") ; // 定义File类对象
if (! file.getParentFile().exists()) { // 父文件夹不存在
file.getParentFile().mkdirs() ; // 创建文件夹
}
PrintStream out = null ; // 打印流
try {
out = new PrintStream(new FileOutputStream(file)); // 实例化打印流对象
out.print(allData.toString()) ; // 输出数据
} catch (Exception e) {
e.printStackTrace() ;
} finally {
if (out != null) {
out.close() ; // 关闭打印流
}
}
}
}
参考:
mldn android培训视频教程
http://www.ruanyifeng.com/blog/2009/05/data_types_and_json.html
http://www.json.org/json-zh.html