1.什么是json
JSON(JavaScript Object Notation, JS 对象简谱) 采用完全独立于编程语言的用文本格式来存储和表示数据的轻量级的数据交换格式。
2.如何编写json
json是由2个元素组成。
(1)第一个元素,json对象
格式:{名称:数据值,名称:数据值,…}
-------名称:数据值——键值对
键值对中的键要有” ”,键值对中的值字符串和时间日期型的数据需要“ ”。
例:
public class Student{
private int stuid;
private String stuname;
private int stuage;
private String stuaddress;
getXXX()/setXXX()
}
Student stu1=new Student();
stu1.setStuid(1001);
stu1.setStuname("zhangsan");
stu1.setStuage(23);
stu1.setStuaddress("西安");
转换成json对象:
{"stuid":1001,"stuname":"zhangsan","stuage":23,"stuaddress":"西安"}
(2)第二个元素,json数组
格式:[具体的数据值/json对象]
例:
public class Student{
private int stuid;
private String stuname;
private int stuage;
private String stuaddress;
getXXX()/setXXX()
}
Student stu1=new Student();
stu1.setStuid(1001);
stu1.setStuname("zhangsan");
stu1.setStuage(23);
stu1.setStuaddress("西安");
Student stu2=new Student();
stu2.setStuid(1002);
stu2.setStuname("lisi");
stu2.setStuage(24);
stu2.setStuaddress("北京");
Student stu3=new Student();
stu3.setStuid(1003);
stu3.setStuname("wangwu");
stu3.setStuage(25);
stu3.setStuaddress("上海");
List<Student> studentlist=new ArrayList<Student>();
studentlist.add(stu1);
studentlist.add(stu2);
studentlist.add(stu3);
将java集合转换成json数组以后的结果:
json数组:
[
{"stuid":1001,"stuname":"zhangsan","stuage":23,"stuaddress":"西安"},
{"stuid":1002,"stuname":"lisi","stuage":24,"stuaddress":"北京"},
{"stuid":1003,"stuname":"wangwu","stuage":25,"stuaddress":"上海"}
]
将java数组转换成json数组以后的结果:
java数组:String names[]={"zhangsan","lisi","wangwu"};
json数组:["zhangsan","lisi","wangwu"]
总结:
我们以后所面临的json数据都是相互嵌套的,json数组中有json对象,json对象中有json数组。当我们得到一个极其复杂的json数据后,搞不清楚这个json数据的结构。
我们可以利用工具【https://www.json.cn/】得到明晰的json数据的结构。
json数据都是相互嵌套,例如:
public class Student {
private int stuid;
private String stuname;
private int stuage;
private MyAddress myAddress[];
public int getStuid() {
return stuid;
}
public void setStuid(int stuid) {
this.stuid = stuid;
}
public String getStuname() {
return stuname;
}
public void setStuname(String stuname) {
this.stuname = stuname;
}
public int getStuage() {
return stuage;
}
public void setStuage(int stuage) {
this.stuage = stuage;
}
public MyAddress[] getMyAddress() {
return myAddress;
}
public void setMyAddress(MyAddress[] myAddress) {
this.myAddress = myAddress;
}
}
public class MyAddress {
private String type;
private String info;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
Student stu1=new Student();
stu1.setStuid(1001);
stu1.setStuname("zhangsan");
stu1.setStuage(23);
MyAddress address1=new MyAddress();
address1.setType("工作");
address1.setInfo("锦业1路");
MyAddress address2=new MyAddress();
address2.setType("家庭");
address2.setInfo("高新4路");
MyAddress myAddressArray1[]={address1,address2};
stu1.setMyAddress(myAddressArray1);
Student stu2=new Student();
stu2.setStuid(1002);
stu2.setStuname("lisi");
stu2.setStuage(24);
MyAddress address21=new MyAddress();
address21.setType("工作");
address21.setInfo("自强1路");
MyAddress address22=new MyAddress();
address22.setType("家庭");
address22.setInfo("团结4路");
MyAddress myAddressArray2[]={address21,address22};
stu2.setMyAddress(myAddressArray2);
List<Student> studentlist=new ArrayList<Student>();
studentlist.add(stu1);
studentlist.add(stu2);
}
}
转换成json数据
[
{"stuid":1001, "stuname":"zhangsan","stuage":23,
"stuaddress":[{"type":"工作","info":"锦业1路"},
{"type":"家庭","info":"高新4路"}
]
},
{"stuid":1002,"stuname":"lisi","stuage":24,
"stuaddress":[{"type":"工作","info":"自强1路"},
{"type":"家庭","info":"团结4路"}
]
}
]
3.json数据的生成
3.1 JSON-simple-1.1.jar第三方的开发包生成json数据
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
public class JSONHelper {
/**
* JSON -simple-1.1.jar第三方的开发包生成json数据
*
*/
public static String createjson1(List<Student> studentlist) {
//创建studentlist对应的json数组
JSONArray studentjsonarray = new JSONArray();
//循环遍历studentlist
for(Student student:studentlist){
//创建student对应的json对象
JSONObject jsonObject = new JSONObject();
jsonObject.put("stuid", student.getStuid());
jsonObject.put("stuname",student.getStuname());
jsonObject.put("stuage", student.getStuage());
//创建保存地址的json数组
JSONArray addressjsonArray = new JSONArray();
MyAddress[] myAddress = student.getMyAddress();
//遍历地址数组
for(MyAddress address:myAddress){
//创建address对应的json对象
JSONObject addressjsonObject = new JSONObject();
addressjsonObject.put("type", address.getType());
addressjsonObject.put("info", address.getInfo());
//地址对象放到地址数组
addressjsonArray.add(addressjsonObject);
}
//地址json数组放到student的json对象
jsonObject.put("stuaddress", addressjsonArray);
studentjsonarray.add(jsonObject);
}
String str = studentjsonarray.toString();
return str;
}
}
主方法:
//生成json数据
String createjson1 = JSONHelper.createjson1(studentlist);
System.out.println(createjson1);
输出为:
[{"stuaddress":[{"type":"工作","info":"锦业1路"},{"type":"家庭","info":"高新4路"}],"stuid":1001,"stuname":"zhangsan","stuage":23},{"stuaddress":[{"type":"工作","info":"自强1路"},{"type":"家庭","info":"团结4路"}],"stuid":1002,"stuname":"lisi","stuage":24}]
利用网站转换看看结构:
3.2 Gson-2.8.0.jar第三方的开发包生成json数据
/**
* Gson-2.8.0.jar第三方的开发包生成json数据
*
*/
public static String createjson2(List<Student> studentlist) {
Gson gson = new Gson();
String json = gson.toJson(studentlist);
return json;
}
输出:
[{"stuid":1001,"stuname":"zhangsan","stuage":23,"myAddress":[{"type":"工作","info":"锦业1路"},{"type":"家庭","info":"高新4路"}]},{"stuid":1002,"stuname":"lisi","stuage":24,"myAddress":[{"type":"工作","info":"自强1路"},{"type":"家庭","info":"团结4路"}]}]
3.3 jackson第三方的开发包生成json数据
/**
* jackson第三方的开发包生成json数据
*
*/
public static String createjson3(List<Student> studentlist) {
ObjectMapper objectMapper = new ObjectMapper();
String jsonstring="[]";
try {
jsonstring = objectMapper.writeValueAsString(studentlist);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return jsonstring;
}
输出:
[{"stuid":1001,"stuname":"zhangsan","stuage":23,"myAddress":[{"type":"工作","info":"锦业1路"},{"type":"家庭","info":"高新4路"}]},{"stuid":1002,"stuname":"lisi","stuage":24,"myAddress":[{"type":"工作","info":"自强1路"},{"type":"家庭","info":"团结4路"}]}]
3.4 拼接字符串生成json数据
不推荐使用,因为“”特别任意出错
/**
* 拼接字符串
*/
public static String createjson4(List<Student> studentlist) {
StringBuilder stringBuilder=new StringBuilder();
stringBuilder.append("[");
for(Student student:studentlist){
stringBuilder.append("{");
stringBuilder.append("\"stuid\":"+student.getStuid()+",");
stringBuilder.append("\"stuname\":\""+student.getStuid()+"\",");
stringBuilder.append("\"stuage\":"+student.getStuid()+",");
stringBuilder.append("\"stuaress\":[");
MyAddress myaddress[]=student.getMyAddress();
for(MyAddress address:myaddress){
stringBuilder.append("{");
stringBuilder.append("\"type\":\""+address.getType()+"\",");
stringBuilder.append("\"info\":\""+address.getInfo()+"\"");
stringBuilder.append("},");
}
stringBuilder.deleteCharAt(stringBuilder.lastIndexOf(","));
stringBuilder.append("]");
stringBuilder.append("},");
}
stringBuilder.deleteCharAt(stringBuilder.lastIndexOf(","));
stringBuilder.append("]");
String string = stringBuilder.toString();
return string;
}
4.解析json
4.1 json-simple-1.1.jar第三方的开发包解析json数据
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
public class JSONHelper {
public static List<Student> getStudentlist1(String filename) throws Exception {
List<Student> studentlist = new ArrayList();
try {
// 读取数据
BufferedReader in = new BufferedReader(new FileReader(new File(filename)));
String jsonstring = in.readLine();
in.close();
// 开始解析
// 创建解析器
JSONParser jsonParser = new JSONParser();
// 得到json数组
JSONArray studentlistArray = (JSONArray) jsonParser.parse(jsonstring);
// 普通for循环遍历
for (int i = 0; i < studentlistArray.size(); i++) {
Student student = new Student();
// 得到json对象
JSONObject studentjsonObject = (JSONObject) studentlistArray.get(i);
long id = (Long) studentjsonObject.get("stuid");
int stuid=(int)id;//必须先转为long,在转int
student.setStuid(stuid);
String stuname = (String) studentjsonObject.get("stuname");
student.setStuname(stuname);
long age = (Long) studentjsonObject.get("stuage");
int stuage=(int)age;
student.setStuage(stuage);
// 得地址json数组
JSONArray addressJSONArray = (JSONArray) studentjsonObject.get("myAddress");
// 遍历json数组
MyAddress myaddressarray[] = new MyAddress[addressJSONArray.size()];
for (int j = 0; j < addressJSONArray.size(); j++) {
MyAddress myAddress = new MyAddress();
JSONObject addressJSONObject = (JSONObject) addressJSONArray.get(j);
String type = (String) addressJSONObject.get("type");
myAddress.setType(type);
String info = (String) addressJSONObject.get("info");
myAddress.setInfo(info);
myaddressarray[j] = myAddress;
}
student.setMyAddress(myaddressarray);
studentlist.add(student);
}
} catch (Exception e) {
e.printStackTrace();
}
return studentlist;
}
}
测试类:
public class Main {
public static void main(String[] args) throws Exception {
List<Student> studentlist1=JSONHelper.getStudentlist1("student.json");
//遍历测试一下
for(Student stu:studentlist1){
System.out.println(stu.getStuname()+"\t"+stu.getMyAddress()[0].getInfo());
}
}
}
输出:
zhangsan 锦业1路
lisi 自强1路
4.2 gson-2.8.0.jar第三方的开发包解析json数据
import com.google.gson.Gson;
import com.google.gson.JsonIOException;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;
/**
*gson-2.8.0.jar第三方的开发包解析json数据
*
*/
public static List<Student> getStudentlist2(String filename) throws Exception {
Gson gson = new Gson();
Type type=new TypeToken<List<Student>>(){}.getType();
return gson.fromJson(new FileReader(filename), type);
}
4.3 jackson第三方的开发包解析json数据
/**
* jackson第三方的开发包解析json数据
*/
public static List<Student> getStudentlist3(String filename) throws Exception {
List<Student> studentlist = new ArrayList();
ObjectMapper objectMapper = new ObjectMapper();
JsonNode studentlistarray = objectMapper.readTree(new File(filename));
for(int i=0;i<studentlistarray.size();i++){
Student student=new Student();
JsonNode studentObject = studentlistarray.get(i);
int stuid = studentObject.get("stuid").asInt();
student.setStuid(stuid);
String stuname = studentObject.get("stuname").asText();
student.setStuname(stuname);
int stuage = studentObject.get("stuage").asInt();
student.setStuage(stuage);
JsonNode addressarray = studentObject.get("myAddress");
MyAddress address[]=new MyAddress[addressarray.size()];
for(int j=0;j<addressarray.size();j++){
MyAddress myaddress=new MyAddress();
JsonNode addressobj = addressarray.get(j);
String type = addressobj.get("type").asText();
String info = addressobj.get("info").asText();
myaddress.setType(type);
myaddress.setInfo(info);
address[j]=myaddress;
}
student.setMyAddress(address);
studentlist.add(student);
}
return studentlist;
}