JSON
1、什么是JSON?
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
Json数据格式:
- json一共有两种数据格式
第一种格式
- 以(key/value)对的形式存在的无序的jsonObject对象。一个对象以“{”开始,以“}”结束。每个“名称”后跟一个“:”;“名称/值”对之间使用“,”分割。
- 对于这种数据格式,key值必须要是String类型,而对于value,可以是String、number、object、array、boolean、null等数据类型
{
"name":"zack",
"age":20
}
第二种格式
有序的value集合,这种形式被称为jsonArray,数组是值(value)的有序集合。一个数组以“[”开始,以“]”结束,值之间使用“,”分隔。
{
"student":
[
{"name":"zack","age":20},
{"name":"jack","age":25}
]
}
2.Json数据类型
2-1json对象
- json对象在花括号中书写;
- 对象包含多个名称/值对;
{"firstname":"John","lastname":"Doe"}
2-2json数组
- json数组在方括号中书写
- 数组可包含多个对象
{
"employees":[
{"firstname":"alex","lastname":"andy"},
{"firstname":"zack","lastname":"herry"}
]
}
ps:jsonObject与jsonArray的区别
json数组
{
"cat":"it",
"language":[
{"id":1,"ide":"eclipse","name":Java},
{"id":2,"ide":"XCode","name":"Swift"},
{"id":3,"ide":"Visual Stdio","name":"C#"}
],
"pop":true
}
json对象
{
"name": "Tim",
"info": {
"score": {
"english": "A",
"math": "B"
},
"age": 20
}
}
3、org.json
org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类.和其他解析工具相比要轻量的多只需要导入org,json的jar包即可,不用依赖其他的jar包。其他不同之处在这里不做介绍了
3.1解析案例以及代码案例
解析json对象
package test;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.json.JSONException;
import org.json.JSONObject;
public class ReadJson {
// 简单的json测试字符串
public static final String JSON_SIMPLE = "{'name':'tom','age':16}";
//嵌套的json测试字符串
public static final String JSON_MULTI = "{'name':'tom','score':{'Math':98,'English':90}}";
public static void main(String [] args){
printSimple();
printMulit();
}
//解析json数据
public static Map<String, String> toMap(String jsonString) throws JSONException {
JSONObject jsonObject = new JSONObject(jsonString);
Map<String, String> result = new HashMap<String, String>();
Iterator<?> iterator = jsonObject.keys();
String key = null;
String value = null;
while (iterator.hasNext()) {
key = (String) iterator.next();
value = jsonObject.getString(key);
result.put(key, value);
}
return result;
}
//输出简单的json格式数据
public static void printSimple(){
String jsonString=JSON_SIMPLE;
Map<String, String> map=null;
try {
map=toMap(jsonString);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String name=map.get("name");
String age=map.get("age");
System.out.println(name+"------"+age);
}
//输出嵌套的json格式出去
public static void printMulit(){
String jsonString=JSON_MULTI;
Map<String, String> map=null;
Map<String, String> map1=null;
try {
map=toMap(jsonString);
String name=map.get("name");
String score=map.get("score");
map1=toMap(score);
String Math=map1.get("Math");
String English=map1.get("English");
System.out.println(name+"-"+Math+"-"+English);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
解析json数组
package test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class ReadJson2 {
//json字符串
static String JsonStr = "{object:{persons:" +
"[{name:'呵呵',image:'http://10.0.159.132:8080/Web/s1.png'}," +
"{name:'哈哈',image:'http://10.0.159.132:8080/Web/s1.png'}," +
"{name:'嘿嘿',image:'http://10.0.159.132:8080/Web/s2.jpg'}]}}";
public static void main(String []args) throws JSONException{
List<Person> list=jsonStrToList(JsonStr);
Iterator<Person> it = list.iterator();
while(it.hasNext()){
Person p = (Person) it.next();
System.out.println(p.getName()+"--"+p.getImage());
}
}
/**
* 解析json数组中的jsonObject
* @param jsonStr
* @return
* @throws JSONException
*/
public static List<Person> jsonStrToList(String jsonStr) throws JSONException{
List<Person> list=new ArrayList<Person>();
//通过字符串,获得最外部的json对象
JSONObject jsonObj=new JSONObject(jsonStr);
//通过属性名,获得内部的对象
JSONObject jsonPersons=jsonObj.getJSONObject("object");
//获得json对象组
JSONArray arr=jsonPersons.getJSONArray("persons");
for(int i=0;i<arr.length();i++){
//循环对象,并通过getString("属性名");来获得值
JSONObject tempJson=arr.getJSONObject(i);
Person person=new Person();
person.setName(tempJson.getString("name"));
person.setImage(tempJson.getString("image"));
list.add(person);
}
return list;
}
}
3.2构造案例及代码
JSONObject的构造json
package test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONException;
import org.json.JSONObject;
public class writeJson {
public static void constructorTest() throws JSONException {
String jsonStr = "{'name':'JTZen9','age':21}";
JSONObject strJson;
// 传入字符串
strJson = new JSONObject(jsonStr);
System.out.println("构造参数为String类:" + strJson);
Map<String, Object> map = new HashMap<String, Object>();
map.put("age", 21);
map.put("sex", "male");
map.put("name", "JTZen9");
JSONObject mapJson = new JSONObject(map); // 传入Map类型
System.out.println("构造参数为Map类:" + mapJson);
Student student = new Student();
student.setAge(21);
student.setName("JTZen9");
student.setSex("male");
JSONObject beanJson = new JSONObject(student); // 传入Bean类型
System.out.println("构造参数为Bean类:" + beanJson);
}
public static void putMethodTest() throws JSONException {
JSONObject jsonObject1 = new JSONObject();
jsonObject1.put("bookName", "JTZen9");
jsonObject1.put("age", 21);
System.out.println(jsonObject1);
JSONObject jsonObject2 = new JSONObject();
List<Object> list = new ArrayList<Object>();
for (int i = 1; i < 3; i++) {
Map<String , Object> map = new HashMap<String ,Object>();
map.put("title", "java程序设计 第" + i + "版");
map.put("price", i*20);
list.add(map);
}
jsonObject2.put("book", list);
System.out.println(jsonObject2);
Student student = new Student();
student.setAge(21);
student.setName("JTZen9");
student.setSex("male");
jsonObject2 = new JSONObject(student);
JSONObject jsonObject3 = new JSONObject();
jsonObject3.put("people", jsonObject2); //不可以直接传bean类对象put("people",student)
System.out.println(jsonObject3);
}
public static void main(String[] args) throws Exception {
constructorTest();
System.out.println("---------------------------------------------------------");
putMethodTest();
}
}
JSONArray构造json
package test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.json.JSONArray;
import org.json.JSONException;
public class JsonArrayTest {
public static void constructorTest() throws JSONException {
String jsonStr = "[{'name':'JTZen9','age':21}]";
JSONArray strJson = new JSONArray(jsonStr); // 传入字符串
System.out.println("构造参数为String类:" + strJson);
List<Object> list = new ArrayList<Object>();
for (int i = 1; i < 3; i++) {
Map<String ,Object> map = new HashMap<String, Object>();
map.put("title", "java程序设计 第" + i + "版");
map.put("price", i*20);
list.add(map);
}
JSONArray mapJson = new JSONArray(list); // 传入Collection类型
System.out.println("构造参数为Collection类:" + mapJson);
int[] numlist = new int[10];
for (int i = 0; i < numlist.length; i++) {
numlist[i] = i;
}
JSONArray arrayJson = new JSONArray(numlist); // 传入Array类型,实例1
System.out.println(arrayJson);
Student[] student = {new Student(),new Student()};
student[0].setAge(21);
student[0].setName("JTZen9");
student[0].setSex("male");
student[1].setAge(21);
student[1].setName("heiheihei");
student[1].setSex("female");
JSONArray beanJson = new JSONArray(student); // 传入Array类型,实例2
System.out.println("构造参数为Array类:" + beanJson);
}
public static void putMethodTest() throws JSONException {
JSONArray jsonArray1 = new JSONArray();
jsonArray1.put("JTZen9");
jsonArray1.put(21);
jsonArray1.put("male");
System.out.println(jsonArray1);
JSONArray jsonArray2 = new JSONArray();
Map<String ,Object> map = new HashMap<String ,Object>();
map.put("title", "java程序设计 第2版");
map.put("price", 20);
jsonArray2.put(map); //传入一个map
System.out.println("传入一个Map:" + jsonArray2);
map.clear();
map.put("title", "java程序设计 第3版");
map.put("price", 30);
jsonArray2.put(map); //没有下标的直接在结果后面添加
System.out.println("没有指定下标:" + jsonArray2);
map.clear();
map.put("title", "java程序设计 第1版");
map.put("price", 10);
jsonArray2.put(0,map); //使用下标可以添加到自定义的位置
System.out.println("添加到第一个位置:" + jsonArray2);
Student[] student = { new Student(), new Student() };
student[0].setAge(21);
student[0].setName("JTZen9");
student[0].setSex("male");
student[1].setAge(21);
student[1].setName("heiheihei");
student[1].setSex("female");
JSONArray jsonArray3 = new JSONArray();
jsonArray3.put(student);
System.out.println("注意输出结果:" + jsonArray3);
}
public static void main(String[] args) throws JSONException {
constructorTest();
System.out.println("-------------------------------------------------");
putMethodTest();
}
}
JSONStringer.java & JSONWriter.java
package test;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import org.json.JSONStringer;
import org.json.JSONWriter;
public class JSONWriterStringerTest {
public static void JSONStringerTest() throws Exception {
PrintWriter writer = new PrintWriter("test.txt");
JSONWriter jsonWriter = new JSONWriter(writer);
jsonWriter.object().key("name").value("JTZen9").key("age").value(21).key("sex").value("male").endObject();
writer.flush();
writer.close();
Map<String ,Object> map1 = new HashMap<String ,Object>();
map1.put("age", 21);
map1.put("sex", "male");
map1.put("name", "jtzen9");
Map<String ,Object> map2 = new HashMap<String ,Object>();
map2.put("age", 21);
map2.put("sex", "female");
map2.put("name", "heiheihei");
JSONStringer jsonStringer = new JSONStringer();
jsonStringer.array().value(map1).value(map2).endArray();
System.out.println(jsonStringer);
}
public static void main(String[] args) throws Exception {
JSONStringerTest();
}
}
test.txt中的内容
{"name":"JTZen9","age":21,"sex":"male"}
JSONTokener
- JSONTokener读取包含json格式数据的文件,然后可以将JSONTokener对象作为参数来构造JSONObject或JSONArray,然后再进行相应的解析。
- 以上面的test.txt为例,简单代码示例如下:
package test;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import org.json.JSONObject;
import org.json.JSONTokener;
public class JSONTokenerTest {
public static void readJsonFile() throws Exception {
FileReader fr = new FileReader("test.txt");
BufferedReader bufr = new BufferedReader(fr);
String jsonStr = "";
String line = null;
StringBuffer sb = new StringBuffer();
while ((line = bufr.readLine()) != null) {
sb.append(line);
}
jsonStr = sb.toString();
bufr.close();
JSONTokener jsonTokener = new JSONTokener(jsonStr);
JSONObject jsonObject = new JSONObject(jsonTokener);
System.out.println(jsonObject);
System.out.println("姓名:" + jsonObject.getString("name"));
System.out.println("年龄:" + jsonObject.getInt("age"));
}
public static void main(String[] args) throws Exception {
readJsonFile();
}
}
解析文件中的json格式数据
json.txt
[
{
"institute":{
"name":"Software Institute",
"grade":[
{
"name":"freshman",
"class":[
{
"no.":1,
"students":61
},
{
"no.":2,
"students":62
},
{
"no.":3,
"students":63
}
]
},
{
"name":"sophomore",
"class":[
{
"no.":1,
"students":51
},
{
"no.":2,
"students":52
},
{
"no.":3,
"students":53
}
]
},
{
"name":"junior",
"class":[
{
"no.":1,
"students":41
},
{
"no.":2,
"students":42
},
{
"no.":3,
"students":43
}
]
}
]
}
}
]
取grade为sophomore的no.等于3的students数量,那么代码如下:
package test;
import java.io.BufferedReader;
import java.io.FileReader;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONTokener;
public class JSONTest {
public static void main(String[] args) throws Exception {
FileReader fr = new FileReader("json.txt");
BufferedReader bufr = new BufferedReader(fr);
String jsonStr = "";
String line = null;
StringBuffer sb = new StringBuffer();
while ((line = bufr.readLine()) != null) {
sb.append(line);
}
jsonStr = sb.toString();
bufr.close();
JSONTokener jsonTokener = new JSONTokener(jsonStr);
JSONArray jsonArray = new JSONArray(jsonTokener);//获取整个json文件的内容,因为最外层是数组,所以用JSONArray来构造
System.out.println(jsonArray);
//这个JSONArray数组只包含一个JSONObject对象,标为jsonObject1
JSONObject jsonObject1 = jsonArray.getJSONObject(0);
System.out.println(jsonObject1);
//jsonObject1只包含一个institute字段,这里获取这个字段内容赋给jsonObject2
JSONObject jsonObject2 = jsonObject1.getJSONObject("institute");
System.out.println(jsonObject2);
//jsonObject2包含name字段和grade字段,grade字段对应的是一个JSONArray数组
String valueOfname = jsonObject2.getString("name");
System.out.println(valueOfname);
JSONArray jsonArray2 = jsonObject2.getJSONArray("grade");
System.out.println(jsonArray2);
//jsonArray2数组包含3个对象,每个对象里面有name字段和class字段,这里获取第二个对象
JSONObject jsonObject3 = jsonArray2.getJSONObject(1);
System.out.println(jsonObject3);
//然后从jsonObject3对象里获取class字段对应的JSONArray数组
JSONArray jsonArray3 = jsonObject3.getJSONArray("class");
System.out.println(jsonArray3);
//下面直接获取no.等于3的students数量,过程都一样
int num = jsonArray3.getJSONObject(2).getInt("students");
System.out.println("最后获取的结果为:" + num);
}
}