一,JSONObject的创建
将JSON对象写入存储卡
/**
* 将JSON对象写入存储卡
*
* @param person
* @throws FileNotFoundException
*/
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 不存在不操作
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
// 返回到程序的被调用出
return;
}
// 将JSON对象写入存储卡
writeJSONObjectToSdCard(createJSONObject());
}
/**
* 将JSON对象写入存储卡
*
* @param person
* @throws FileNotFoundException
*/
private void writeJSONObjectToSdCard(JSONObject person) {
File file = new File(Environment.getExternalStorageDirectory() + File.separator + "json"
+ File.separator + "json.txt");
// 文件夹不存在的话,就创建文件夹
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
// 写入内存卡
PrintStream outputStream = null;
try {
outputStream = new PrintStream(new FileOutputStream(file));
outputStream.print(person.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
outputStream.close();
}
}
}
/**
*
{
"phone" : ["12345678", "87654321"], // 数组
"name" : "tianjiefeng", // 字符串
"age" : 100, // 数值
"address" : { "country" : "china", "province" : "jiangsu" }, // JSON对象
"married" : false // 布尔值
}
*
*/
private JSONObject createJSONObject() {
// 最外层是{},也就是一个JSONObject对象
JSONObject person = new JSONObject();
try {
// 第1个value是[ ],也就是一个JSONArray对象
JSONArray phone = new JSONArray();
phone.put("12345678");
phone.put("87654321");
person.put("phone", phone);
// 第2个value一个字符串
person.put("name", "tianjiefeng");
// 第3个value一个字符串数值
person.put("age", 100);
// 第4个value一个JSONObject对象
JSONObject address = new JSONObject();
address.put("country", "china");
address.put("province", "jiangsu");
person.put("address", address);
// 第5个value一个布尔值
person.put("married", false);
} catch (JSONException e) {
e.printStackTrace();
}
return person;
}
}
运行一下,打开File Explorer视图,打开mnt - sdcard - json目录,将里面的json.txt导出到计算机里面,就可以看到JSON对象以字符串的形式成功写入到了json.txt文件中
二,json解析方法一:
/**
*
{
"phone" : ["12345678", "87654321"], // 数组
"name" : "tianjiefeng", // 字符串
"age" : 100, // 数值
"address" : { "country" : "china", "province" : "jiangsu" }, // JSON对象
"married" : false // 布尔值
}
*
*/
public class JSONParseDemoActivity extends Activity {
private static final String JSONString = "{" + "\"phone\":[\"12345678\",\"87654321\"],"
+ "\"name\":\"tianjiefeng\"," + "\"age\":100,"
+ "\"address\":{\"country\":\"china\",\"province\":\"jiangsu\"},"
+ "\"married\":false" + "}";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 解析得到一个Map对象
Map<String, Object> personMap = parseJSONString(JSONString);
Log.d("debug",
"phone:" + personMap.get("phone") + "\n" + "name:" + personMap.get("name") + "\n"
+ "age:" + personMap.get("age") + "\n" + "address:"
+ personMap.get("address") + "\n" + "married:" + personMap.get("married"));
}
/**
* JSON解析
*
* @param JSONString
* @return
*/
private Map<String, Object> parseJSONString(String jsonstring2) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
// 直接把JSON字符串转化为一个JSONObject对象
JSONObject person = new JSONObject(JSONString);
// 第1个键值对
resultMap.put("phone", person.getJSONArray("phone").toString());
// 第2个键值对
resultMap.put("name", person.getString("name"));
// 第3个键值对
resultMap.put("age", person.getInt("age"));
// 第4个键值对
resultMap.put("address", person.getJSONObject("address").toString());
// 第5个键值对
resultMap.put("married", person.getBoolean("married"));
} catch (JSONException e) {
e.printStackTrace();
}
return resultMap;
}
}
三,json解析方法二:
用JsonReader来读取JSON字符串的内容
打开Android帮助文档找到JsonReader,会发现Since: API Level 11(3.0),也就是说3.0之前的SDK是没有JsonReader的。如果要对应3.0之前的版本,可以到Google的网站上去下载gson的jar包(URL:http://code.google.com/p/google-gson/downloads/list)。jar包导入项目的流程如下:
新建libs文件夹,把下载的jar包添加到libs文件夹中
右键gson-1.6.jar --> Build Path --> Add to Build Path(add操作之后就会看到Package视图下的Referenced Libraries下多了个gson-1.6.jar,说明jar包添加成功)
添加好了jar包,我们就可以使用JsonReader了。具体代码如下
utils类:
//"[{"name":"Michael","age":20},{"name":"Mike","age":21}]"
public class JSONUtils {
public void parseJson(String jsonData) { try {
// 如果需要解析JSON数据,首要要生成一个JsonReader对象
JsonReader reader = new JsonReader(new StringReader(jsonData));
// 开始解析数组
reader.beginArray();
// 判断数组里面还有没下一个JSONObject对象
while (reader.hasNext()) {
// 开始解析对象
reader.beginObject();
// 判断当前JSONObject对象里面还有没下一个键值对
while (reader.hasNext()) {
// 取出当前键值对的key
String tagName = reader.nextName();
// 取出key所对应的value
if (tagName.equals("name")) {
System.out.println("name--->" + reader.nextString());
} else if (tagName.equals("age")) {
System.out.println("age--->" + reader.nextInt());
}
}
// 结束解析对象
reader.endObject();
}
// 结束解析数组
reader.endArray();
} catch (Exception e) {
e.printStackTrace();
}
}
}
调用:
public class GSONParseDemoActivity extends Activity {
private static final String JSONString = "[{\"name\":\"Michael\",\"age\":20},{\"name\":\"Mike\",\"age\":21}]";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
JSONUtils jsonUtils = new JSONUtils();
jsonUtils.parseJson(JSONString);
}
}
这个例子是解析[{"name":"Michael","age":20},{"name":"Mike","age":21}]这个JSON字符串
先分析一下这个JSON字符串的结构:一个JSONArray里面有两个JSONObject
再分析一下JsonReader解析这个JSON字符串的流程:
遇到【[】,开始解析数组(reader.beginArray())
遇到【{】,开始解析对象(reader.beginObject())
遇到【"】,开始解析第一个键值对
遇到【"】,开始解析第二个键值对
遇到【}】,结束解析对象(reader.endObject())
遇到【{】,开始解析对象(reader.beginObject())
遇到【"】,开始解析第一个键值对
遇到【"】,开始解析第二个键值对
遇到【}】,结束解析对象(reader.endObject())
遇到【]】,结束解析数组(reader.endArray())
四,json解析方法三:
Gson类的fromJson方法自动解析并自动得到一个Entity对象,代码如下
user
package com.example.jsonparser.bean;
public class User {
private String name ;
private int age ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
utils:
//"{"name":"Michael","age":20}"
public class JSONUtils2 {
public void parseUserFromJson(String jsonData) {
Gson gson = new Gson();
// Gson的fromJson方法是一 一对应的关系,自动将JSON的数据匹配到User对象中
User user = gson.fromJson(jsonData, User.class);
System.out.println("name--->" + user.getName());
System.out.println("age---->" + user.getAge());
}
}
调用:
//一个json对象的情况
public class GSONParseDemoActivity2 extends Activity {
private static final String JSONString ="{\"name\":\"Michael\",\"age\":20}";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
JSONUtils2 jsonUtils2 = new JSONUtils2();
jsonUtils2.parseUserFromJson(JSONString);
}
}
注意这个方法只能是一个json对象的情况,如果多个,这样使用会报错。
五,json解析方法四:
上面的例子只有一个JSONObject对象,如果有多个对象怎么做到直接映射到一个User的List里面呢?代码如下
user
代码同上
utils:
//"[{"name":"Michael","age":20},{"name":"Mike","age":21}]"
public class JSONUtils3 {
public void parseUserFromJson(String jsonData) {
Type listType = new TypeToken<LinkedList<User>>() {}.getType();
Gson gson = new Gson();
LinkedList<User> users = gson.fromJson(jsonData, listType);
Iterator<User> iterator = users.iterator();
while (iterator.hasNext()) {
User user = (User) iterator.next();
System.out.println("name--->" + user.getName());
System.out.println("age---->" + user.getAge());
}
}
}
调用:
//多个json对象的情况
public class GSONParseDemoActivity3 extends Activity {
private static final String JSONString ="[{\"name\":\"Michael\",\"age\":20},{\"name\":\"Mike\",\"age\":21}]";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
JSONUtils3 jsonUtils3 = new JSONUtils3();
jsonUtils3.parseUserFromJson(JSONString);
}
}
注意这样的代码,是解析json数据的情况,如果是一个json对象,使用这种代码则报错。
六,json解析方法五:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//反序列化 —— 把JSON格式的文本转化为Java Bean对象。
String text ="{\"name\":\"Michael\",\"age\":20}";
User user = JSON.parseObject(text, User.class);
Log.i("MainActivity", user.getName()+":"+user.getAge());
//类型集合的反序列化
text ="[{\"name\":\"Michael\",\"age\":20},{\"name\":\"Mike\",\"age\":21}]";
List<User> users = JSON.parseArray(text, User.class);
Iterator i = users.iterator();
for (User user2 : users) {
Log.i("MainActivity", user2.getName()+":"+user2.getAge());
}
}
}
另外,fastjson还支持组合类型集合的反序列化,代码
String text = ...;
// [{/* header */}, {/* body */}]
Type[] types =
new
Type[] {Header.
class
, Body.
class
};
List<Object> list = JSON.parseArray(text, types);
Header header = (Header) list.get(
0
);
Body body = (Body) list.get(
1
);
这里我没有亲自实验。