JSON是大家再熟悉不过的一门数据格式了,它具有很多优点,比如占用带宽比较小(格式是压缩的)、js可以通过eval()读取、支持多种语言(C、C++、JAVA、PHP等等),我们日常开发中用的比较多的是对json进行封装和解析,这块内容也是我们必须去掌握的,所以我花了一点时间对json的各种封装个解析做了一个详细的教程,方便初学者快速上手入门
什么是JSON?
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。它是基于 JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。 JSON采用完全独立于程序语言的文本格式,但是也使用了类C语言的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。JSON就是一串字符串 只不过元素会使用特定的符号标注。
JSON语法规则
JSON 语法是 JavaScript 对象表示语法的子集
{} 双括号表示对象
[] 中括号表示数组
"" 双引号内是属性或值
: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)
数据在键值对中
数据由逗号分隔
比如:{“name”,“zhangb”}表示为一个包含name为zhangb的对象,[{“name”,“zhangb”},{“name”,“lidan”}]表示包含两个对象的数组
这个数组也可以简化为{“name”:[“zhangb”,“lidan”]}
注意:json官网最新的规定如果是字符串,不管是key还是value都得带双引号,比如:{name,‘json’}校验不通过的。
JSON 名称/值对
JSON 数据的书写格式是:名称/值对。
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:
“name” : “zhangb”
这很容易理解,等价于这条 JavaScript 语句:
name = “zhangb”
JSON的拼接和封装
jsonlib的示例
代码示例如下
package com.zhangb;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
/**
* @author zhangb
* @time 0514
* @desccription 拼接、封装json字符串
*/
public class JsonDemo {
public static void main(String[] args) {
setJson();
joinJsonlib();
}
/**
* 采用字符串拼接json
* 此处注意转义符
*/
private static void setJson(){
String str = "{\"status\":0,\"desc\":\"成功\",\"data\":[{\"name\":\"zhangb\",\"sex\":\"男\",\"description\":\"JSON教程\"},{\"name\":\"lidan\",\"sex\":\"女\",\"description\":\"测试\"}]}";
System.out.println("输出字符串拼接的json");
System.out.println(str);
}
/**
* appache的json,需导入以下包才可以使用
* json-lib-2.4-jdk15.jar
* commons-lang.jar
* commons-beanutils.jar
* commons-collections.jar
* commons-logging.jar
* ezmorph.jar
*/
private static void joinJsonlib(){
JSONObject json = new JSONObject();
//可用put或者element添加对象,大部分时候无区别,value为空时候需要注意
json.put("status",0);
json.element("desc","成功");
JSONObject obj = new JSONObject();
JSONArray jsonArray = new JSONArray();
obj.put("name","zhangb");
obj.put("sex","男");
obj.put("desc","JSON教程");
//向obj中添加 对象
jsonArray.add(obj);
//此时obj中已经有了对象,如需要继续添加单独对象,需重新new或者清空obj
obj.clear();
obj.put("name","lidan");
obj.put("sex","女");
obj.put("desc","测试");
jsonArray.add(obj);
//添加到最开始的json
json.put("data",jsonArray);
System.out.println("输出json封装方法");
System.out.println(json.toString());
}
}
输出结果
阿里巴巴json封装
代码示例如下
这一块和json-lib基本上没什么差别,但是咱FastJson只需要一个包,很方便
package com.zhangb;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/**
* @author zhangb
* @time 0514
* @desccription 拼接、封装json字符串
*/
public class JsonDeme01 {
public static void main(String[] args) {
joinAliJson();
}
private static void joinAliJson(){
JSONObject json = new JSONObject();
json.put("status",0);
json.put("desc","成功");
JSONArray jsonArray = new JSONArray();
JSONObject obj = new JSONObject();
obj.put("name","zhangb");
obj.put("sex","男");
obj.put("desc","JSON教程");
//向obj中添加 对象
jsonArray.add(obj);
//此时obj中已经有了对象,如需要继续添加单独对象,需重新new或者清空obj
obj.clear();
obj.put("name","lidan");
obj.put("sex","女");
obj.put("desc","测试");
jsonArray.add(obj);
json.put("data",jsonArray);
System.out.println("阿里巴巴json封装");
System.out.println(json.toJSONString());
}
}
运行结果
Map和JSON之间的转换
代码示例
package com.zhangb;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author zhangb
* @time 0514
* @desccription map与json之间的转换
*/
public class JsonDemo02 {
public static void main(String[] args) {
mapToJson();
}
private static void mapToJson(){
//新建一个map
Map<String,Object> map = new HashMap<>();
map.put("status",0);
map.put("desc","成功");
//新建list<map>
List<Map<String,Object>> mapList = new ArrayList<>();
Map<String,Object> obj = new HashMap<>();
obj.put("name","zhangb");
obj.put("sex","男");
obj.put("desc","JSON教程");
mapList.add(obj);
Map<String,Object> mobj = new HashMap<>();
mobj.put("name","lidan");
mobj.put("sex","女");
mobj.put("desc","测试");
mapList.add(mobj);
//将maplist加入map中
map.put("data",mapList);
//将map转换成json
JSONObject jsonObject = JSONObject.fromObject(map);
//alibaba将map转化为json ,各种方法
String str = JSON.toJSONString(map);
com.alibaba.fastjson.JSONObject str1 = new com.alibaba.fastjson.JSONObject(map);
String str2 = new com.alibaba.fastjson.JSONObject().toJSONString(map);
System.out.println("json-lib的map to json");
System.out.println(jsonObject);
System.out.println("Fastjson的map to json");
System.out.println(str);
System.out.println(str1);
System.out.println(str2);
}
}
输出结果
实体转换成json
代码示例
package com.zhangb;
import com.alibaba.fastjson.JSON;
import com.zhangb.Entity.BaseEntity;
import com.zhangb.Entity.Person;
import net.sf.json.JSONObject;
import javax.swing.text.html.parser.Entity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author zhangb
* @time 0514
* @desccription 实体与json之间的转换
*/
public class JsonDemo03 {
public static void main(String[] args) {
entityToJson();
}
private static void entityToJson(){
BaseEntity baseEntity = new BaseEntity();
baseEntity.setStatus("0");
baseEntity.setDesc("成功");
List<Person> list = new ArrayList<>();
Person p = new Person();
p.setName("zhangb");
p.setSex("男");
p.setDescription("JSON培训");
list.add(p);
Person p1 = new Person();
p1.setName("lidan");
p1.setSex("女");
p1.setDescription("测试");
list.add(p1);
//实体封装完成
baseEntity.setData(list);
// Json lib的转换方法
JSONObject jsonObject = JSONObject.fromObject(baseEntity);
// FastJson的转换方法
String jsonObject1 = new com.alibaba.fastjson.JSONObject().toJSONString(baseEntity);
//也可以反着来JSON串转实体对象
BaseEntity baseEntity1 = JSON.parseObject(jsonObject1,BaseEntity.class);
System.out.println("json-lib的实体 to json");
System.out.println(jsonObject);
System.out.println("Fastjson的实体 to json");
System.out.println(jsonObject1);
}
}
输出结果
Json的解析
代码示例,两者我写到了一起,基本上就是细微差别
package com.zhangb;
import com.alibaba.fastjson.JSON;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
/**
* @author zhangb
* @time 0514
* @desccription json的解析
*/
public class JsonDemo04 {
public static void main(String[] args) {
getJson();
}
/**
* 采用字符串拼接json
* 此处注意转义符
*/
private static String setJson(){
String str = "{\"status\":0,\"desc\":\"成功\",\"data\":[{\"name\":\"zhangb\",\"sex\":\"男\",\"description\":\"JSON教程\"},{\"name\":\"lidan\",\"sex\":\"女\",\"description\":\"测试\"}]}";
System.out.println("输出字符串拼接的json");
System.out.println(str);
return str;
}
private static void getJson(){
String str = setJson();
//json lib格式化
JSONObject jsonObject = JSONObject.fromObject(str);
String status = jsonObject.getString("status");
String desc = jsonObject.getString("desc");
JSONArray jsonArray = jsonObject.getJSONArray("data");
System.out.println("状态:"+status);
System.out.println("描述:"+desc);
for (int i=0;i< jsonArray.size();i++){
JSONObject json = jsonArray.getJSONObject(i);
String name = json.getString("name");
String sex = json.getString("sex");
String description = json.getString("description");
System.out.println("name:"+name+"sex"+sex+"description:"+description);
}
System.out.println("阿里巴巴解析json!");
//阿里巴巴json格式化
com.alibaba.fastjson.JSONObject jsonObject1 = JSON.parseObject(str);
String status1 = jsonObject.getString("status");
String desc1 = jsonObject.getString("desc");
com.alibaba.fastjson.JSONArray jsonArray1 = jsonObject1.getJSONArray("data");
for (int i= 0; i< jsonArray1.size();i++){
com.alibaba.fastjson.JSONObject jsonObject2 = jsonArray1.getJSONObject(i);
String name = jsonObject2.getString("name");
String sex = jsonObject2.getString("sex");
String description = jsonObject2.getString("description");
System.out.println("name:"+name+"sex"+sex+"description:"+description);
}
System.out.println("状态:"+status1);
System.out.println("描述:"+desc1);
}
}
运行结果
相关代码已经提交到我的git,感兴趣的同学可以自行下载
GIT地址:https://github.com/moshushow/JsonDemo