1.json的工具包
json工具包能够将java对象转换成为json对象和xml文档,同样也可以将json、xml转换成Java对象,在这里我给大家介绍两种json工具包
1.1jackson
在将工具包导入之后,如下使用能够将java对象转换成json对象
对象形式
//创建几个对象
Student stu1=new Student("s001", "张三", null);
Student stu2=new Student("s002", "李四", null);
ObjectMapper om=new ObjectMapper();
om.writeValueAsString(stu1);
将json对象输出的结果为{"sid":"s001","sname":"张三","tset":null}
数组形式
public static void main(String[] args) throws JsonProcessingException {
//创建几个对象
Student stu1=new Student("s001", "张三", null);
Student stu2=new Student("s002", "李四", null);
ObjectMapper om=new ObjectMapper();
List<Student> ls=new ArrayList<>();
ls.add(stu1);
ls.add(stu2);
System.out.println(om.writeValueAsString(ls));
}
结果为:[{"sid":"s001","sname":"张三","tset":null},{"sid":"s002","sname":"李四","tset":null}]
混合形式
public static void main(String[] args) throws JsonProcessingException {
//创建几个学生对对象
Student stu1=new Student("s001", "张三", null);
Student stu2=new Student("s002", "李四", null);
//创建几个老师对象
Teacher tea1=new Teacher("t001", "老师1", null);
Teacher tea2=new Teacher("t002", "老师2", null);
ObjectMapper om=new ObjectMapper();
List<Student> ls=new ArrayList<>();
ls.add(stu1);
ls.add(stu2);
Map<String, Object> map=new HashMap<>();
map.put("stus", ls);
map.put("te", tea1);
System.out.println(om.writeValueAsString(map));
}
结果为:{"te":{"sid":"t001","sname":"老师1","se":null},"stus":[{"sid":"s001","sname":"张三","tset":null},{"sid":"s002","sname":"李四","tset":null}]}
2.Fastjson
json对象都是一样的不同的工具包写法不同而已,在这里写一个例子供大家参考
输出的结果是一致的
package com.ywj.entity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
public class Demo {
public static void main(String[] args) {
//创建几个学生对对象
Student stu1=new Student("s001", "张三", null);
Student stu2=new Student("s002", "李四", null);
//创建几个老师对象
Teacher tea1=new Teacher("t001", "老师1", null);
Teacher tea2=new Teacher("t002", "老师2", null);
List<Student> ls=new ArrayList<>();
ls.add(stu1);
ls.add(stu2);
Map<String, Object> map=new HashMap<>();
map.put("stus", ls);
map.put("te", tea1);
/**
* fastjson写法
*/
System.out.println(JSON.toJSONString(map));
}
}
3.转换json时的死循环问题
我们用类来描述一下学生和老师之间多对多的关系,然后将其中的学生对象转换为json,这个时候会栈溢出
public class Demo {
//我们将异常抛出方便阅读
public static void main(String[] args) throws JsonProcessingException {
//创建几个学生对对象
Student stu1=new Student("s001", "张三", null);
Student stu2=new Student("s002", "李四", null);
//创建几个老师对象
Teacher tea1=new Teacher("t001", "老师1", null);
Teacher tea2=new Teacher("t002", "老师2", null);
/**
* 一个老师对应多个学生
*/
Set<Student> stus=new HashSet<>();
stus.add(stu1);
stus.add(stu2);
tea1.setSe(stus);
/**
* 一个学生对应多个老师
*/
Set<Teacher> teachers=new HashSet<>();
teachers.add(tea1);
teachers.add(tea2);
stu1.setTset(teachers);
/**
* 我们将stu1学生对象转成json
*/
ObjectMapper om=new ObjectMapper();
om.writeValueAsString(stu1);
}
报错为栈空间溢出:
Caused by: java.lang.StackOverflowError
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access0(Unknown Source)
at java.net.URLClassLoader.run(Unknown Source)
at java.net.URLClassLoader.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:613)
... 1011 more
解决方法有两种
1.由双向绑定改成单向绑定,也就说将彼此之间的关系交于一方维护
2.第二种是使用@JsonIgnore注解注释一下这样他到这就不会转换
private String sid;
private String sname;
/**
* 一个学生可以对应多个老师
*/
@JsonIgnore
private Set<Teacher> tset=new HashSet<>();
3.jQuery使用ajax
$(function(){
$.ajax({
type: "提交方式get or post",
url: "提交地址",
dataType: "json text xml 等",
data:{数据 name:date},
success: function(msg){
//返回处理的方法
}
});
})
4.不使用实体类json对象的通用查询
这种查询的核心是 ResultSetMetaData metaData = rs.getMetaData();
由于json对象将Map转换之后和java对象转换之后的结果是一致的,所以可以使用
在类包含集合的情况下不能使用
List<Map<String, Object>> list = new ArrayList<>();
/**
* 获取到源数据
*/
ResultSetMetaData metaData = rs.getMetaData();
/**
*获取到有多少个列
*/
int columnCount = metaData.getColumnCount();
Map<String, Object> map=null;//多次引用
while(rs.next()) {
map=new HashMap<String, Object>();
for (int i = 1; i <=columnCount; i++) {
/**
* 获取到列的名字作为键的值
*/
String key = metaData.getColumnName(i);
map.put(key, rs.getObject(key));//用列名做键取值保存到map集合
}
list.add(map);
}
return list;
}
这一行还是很舒服的啦。。。。