Json学习(一)传统的Json解析
一,什么是Json?
说道Json,不得不说程序员和XML的那段孽缘。XML有一定的优越性比如适合在网络上传输(本身是纯文本文件),但是由于规范太多,像什么DTD,XSTL等啊,XML反而变得很复杂,成为了一个历史遗留的病垢吧。后来Json就出现了,Json作为一种轻量级的数据交换形式,抑郁阅读和编写,也易于机器解析和生成。总之,相比于XML,Json更加易于网络传输,重在简易语法,而XML则重在规范,也正是由于规范,所以数据看起来有条有理,而Json则比较不够规整,但是网上有大量的Json解析工具,寡人正在使用的是浏览器插件JSON-handle,大家可以自行搜索。
二.Json的数据类型
number:数值类型
boolean:布尔类型(true和false)
string:字符串类型
array:数组类型
object:对象类型
下面是解析工具的效果及例子:
三,json的解析
有很多种数据与Json之间转换的方法,在此挑了几个方法简单讲一下,其他方法大家就自己尝试着学习一下(不难的)
当我们想要new出一个JSONObject对象时,有很多种初始化的创建方法
1. Map转化为Json(使用率非常高),由上图第一处红框可知我们创建JSONObject对象时传入一个Map那么Map中的数据就自动转化为了Json格式,先初始化一个HashMap
Object obj = null;
map=new HashMap<String, Object>();
hashMap.put("name", "lisi");
hashMap.put("age", 15);
hashMap.put("likes", new String[]{"看电影", "看书"});
hashMap.put("some", obj);
然后创建JSONObject对象
json=new JSONObject(maps);
System.out.println(json.toString());
打印json的数据
{"hasGirlfriend":true,"name":"张三","birth":"1998-01-01","age":20,"likes":["看电影","看书"]}
也就是这个效果
2.Json与JavaBean也就是 DTO的转化,同样由上图第二处红框可知传入一个Bean对象即可将Bean对象转化为Json数据
先创建一个Bean对象Student
public class StudentInfo {
private String name;
private String address;
private double age;
private transient String ingore;
private List<String> likes;
private Date birth;
public List<String> getLikes() {
return likes;
}
public void setLikes(List<String> likes) {
this.likes = likes;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public StudentInfo() {
}
public StudentInfo(String name, String address, int age,String ingore) {
super();
this.name = name;
this.address = address;
this.age = age;
this.ingore=ingore;
}
public String getIngore() {
return ingore;
}
public void setIngore(String ingore) {
this.ingore = ingore;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public double getAge() {
return age;
}
public void setAge(double age) {
this.age = age;
}
}
然后创建Bean的实例
student=new StudentInfo();
student.setAddress("苏州");
student.setAge(15);
student.setName("zhansan");
紧接着初始化json
json=new JSONObject(student);
double age=json.getDouble("age");
System.out.println(age);
System.out.println(json.toString());
从json中获取Bean对象的"age"属性并打印json数据
15.0
{"address":"苏州","name":"zhansan","age":15}
3.从文件中读取数据封装为Json
首先创建一个文件存储数据,可以直接在开发工具上创建json的文件,new--->other,然后搜索json,创建文件
提前在文件中输入一些数据便于获取进行封装,
{"hasGirlfriend":true,"name":"李四","birth":"1998-01-01","age":20.2,"likes":["篮球","足球宝贝"],"major":{"some":15,"adr":"vde"},"address":"eijng"}
然后开始解析文件,由于对文件进行读取,所以写在异常处理块中
File file=new File(App.class.getResource("/student.json").getFile());
try {
String content=FileUtils.readFileToString(file);
JSONObject json=new JSONObject(content);
JSONArray jarray=json.getJSONArray("likes");
for (int i = 0; i < jarray.length(); i++) {
System.out.println(jarray.get(i));
}
System.out.println(json.getString("name"));
System.out.println(json.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
实际上是将文件的信息用文件工具类FileUtils读取到字符串中,然后用带有数据的字符串进行Json的转换(所以说利用字符串也可以直接实现数据的转换),由于之前文件的数据的"likes"是个数组,而接收数组数据时需要使用JSONArray;
篮球
足球宝贝
李四
{"address":"eijng","major":{"some":15,"adr":"vde"},"hasGirlfriend":true,"name":"李四","birth":"1998-01-01","age":20.2,"likes":["篮球","足球宝贝"]}
Json是一种常用的数据类型之一,便于我们开发人员将数据进行封装和转移,更主要的是便于处理,所以,对Json一定要花一点时间去学习
最后,我们来一起看一下 Map转化为JSONObject的源码(不难的)
public JSONObject(Map<?, ?> m) {
if (m == null) {
this.map = new HashMap<String, Object>();
} else {
this.map = new HashMap<String, Object>(m.size());
for (final Entry<?, ?> e : m.entrySet()) {
final Object value = e.getValue();
if (value != null) {
this.map.put(String.valueOf(e.getKey()), wrap(value));
}
}
}
}
首先进行非空判断,若空返回一个HashMap<String, Object>()
若非空遍历HashMap<String, Object>(),此处可以理解为获得map中所有的键值对对象的集合,也就是m.entrySet()
由每个键值对对象获取值,(注意值是Object类型),若果值非空,将键和值put到新的HashMap中