json小结:
Java中并没有内置JSON的解析,因此使用JSON需要借助第三方类库。
下面是几个常用的 JSON 解析类库:
Gson: 谷歌开发的 JSON 库,功能十分全面。
FastJson: 阿里巴巴开发的 JSON 库,性能十分优秀。
Jackson: 社区十分活跃且更新速度很快。
简单使用样例,以FastJson举例:
后端生成的json字符串都是带双引号的,直接传输到前端页面,js无法解析此时后台需要先把双引号变为单引号
后台处理代码:
JSONObject object = new JSONObject();
object.put("sbmc",parentSbmc);
object.put("sydId",sydbone.getId());
object.put("msg","");//msg用于更新,操作所在页面的数据
resString=object.toJSONString().replaceAll("\"", "\'");//该行可以无视 [{'children':[{'name':'变电站03'}],'name':'500kV'},{'children':[{'name':'变电站02'},{'name':'变电站01'}],'name':'220kV'},{'children':[],'name':'otherkV'}]
//使用这个JSON.toJSONString方法时不用替换单双引号
List<Sydbone> byMainId = sydboneDao.getByMainId(Long.parseLong(sydbone.getWj()));
msg = JSON.toJSONString(byMainId).replaceAll("null", "");
前端处理代码:
var jsonMsg = eval('(' + resString+ ')');
alert(jsonMsg.sydId);//可以直接使用对象.属性取值
tip:
数组的数组,还需要套一层eval函数,不然没法用each遍历
var yxData = jsonMsg.msg.yxData;
console.log(yxData);
$.each(eval('(' + yxData+ ')'),function(index,item){
console.log(item.yxmc);
});
-----------------------api----------------------
--Fastjson API
https://www.w3cschool.cn/fastjson/fastjson-api.html
fastJson 常用API使用
Fastjson API入口类是com.alibaba.fastjson.JSON,常用的序列化操作都可以在JSON类上的静态方法直接完成。
public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合
public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
public static final Object toJSON(Object javaObject); // 将JavaBean转换为JSONObject或者JSONArray。
-- gson API
--net.sf.json API
http://json-lib.sourceforge.net/apidocs/jdk15/net/sf/json/package-summary.html
net.sf.json 常用API使用
1. 字符串转JSONObject:
JSONObject jsonObject = JSONObject.fromObject(string);
2. JSONObject 转实体类:
ExtraParamVO extParamVo = (ExtraParamVO) JSONObject.toBean(jsonObject, ExtraParamVO.class);
3. 将java实体类转JSONObject
Student stu1 = new Student("lwc", "111111");
JSONObject jsonObject = JSONObject.fromObject(stu1);
System.out.println(jsonObject);
4. list转数组:
List list = new ArrayList();
list.add(new Student("lwc", "111111"));
list.add(new Student("nxj", "222222"));
JSONArray jsonArray = JSONArray.fromObject(list);
System.out.println(jsonArray);
5. json字符串转list
String jsondata = "[{\"password\":\"111111\",\"username\":\"lwc\"},{\"password\":\"222222\",\"username\":\"nxj\"}]";
JSONArray jsonArray1 = JSONArray.fromObject(jsondata);
for (int i = 0; i < jsonArray1.size(); i++) {
JSONObject jsonObject2 = jsonArray1.getJSONObject(i);
Student stu2 = (Student) JSONObject.toBean(jsonObject2,Student.class);
list1.add(stu2);
}
System.out.println(list1);
-----------------------------四种json maven配置-----------------------------
实验结果:从效率上来讲,当数据量较小时,org.json 处理速度最快,当数据量较大时,com.alibaba.fastjson处理速度最快。
对比源码,显而易见org.json 的 JSONObject 的put()方法,不允许key和value为null,而阿里的fastjson是允许的。
第一种 org.json
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180130</version>
</dependency>
第二种 net.sf.json
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
第三种 com.alibaba.fastjson
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
第四种 com.google.code.gson
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
-----------------------------FastJson-----------------------------
----编码
从 Java 变量到 JSON 使用put方法
JSONObject object = new JSONObject();
//string
object.put("string","string");
----解码
从 JSON 对象到 Java 变量使用getXXX(String key)方法
JSONObject object = JSONObject.parseObject("{\"boolean\":true,\"string\":\"string\",\"list\":[1,2,3],\"int\":2}");
//string
String s = object.getString("string");
System.out.println(s);
//int
int i = object.getIntValue("int");
----JSON 对象与字符串的相互转化
JSON.parseObject() 从字符串解析 JSON 对象
JSON.parseArray() 从字符串解析 JSON 数组
JSON.toJSONString(obj/array) 将 JSON 对象或 JSON 数组转化为字符串
实例
//从字符串解析JSON对象
JSONObject obj = JSON.parseObject("{\"runoob\":\"菜鸟教程\"}");
//从字符串解析JSON数组
JSONArray arr = JSON.parseArray("[\"菜鸟教程\",\"RUNOOB\"]\n");
//将JSON对象转化为字符串
String objStr = JSON.toJSONString(obj);
//将JSON数组转化为字符串
String arrStr = JSON.toJSONString(arr);
详细使用教程,看菜鸟教程
https://www.runoob.com/w3cnote/fastjson-intro.html
-----------------------------Gson-----------------------------
-----------------------------Jackson-----------------------------