Josn的配置和使用
- JSON的基本概念
1.JSON(JavaScript Object Natation) —-javascript的对象表现形式,但是目前已经发展成为一种轻量级的数据交换格式
最大特点:完全独立于语言的文本格式(跨平台数据格式)不依赖于任何语言、有结构的、方便人和机器解析
使用场景:
1):不同语言之间的数据传递(Json的本质就是String,但是它是有格式的),后台的list转换为json,前端才可以解析
比如EasyUI(javascript )+SSH(java)之间的数据传递
2)前端的js和后台的java数据传递
比如:java处理完数据以List /Map/Set的数据格式输出,但是这些数据格式无法被js识别
SSH和easyUI/EXTJS/Ajax进行交互是通过json格式数据来进行的
SSH和Flex(Adobe Flash)也是通过json格式的数据
HTML5 WebSocket —>javascript 之间的数据也是json
JSON与XML、Properties的区别
1.json是轻量级的,而XML是重量级的(比如web.xml配置过滤器、监听器以及各种web组件 其中重要信息数据还没有描述数据的标签多)xml的可读性是建立的在大量标签基础之上的。
目前xml一般用于项目(框架)配置,而很少用来进行数据传输
2.json是有结构的,但是properties仅仅是key-value键值对,意味着json可以传送一些丰富复杂的数据,可以传送含有子对象的对象
- JSON语法介绍
官网:www.json.org
空对象:{ }
json对象的结构:
{ "key":"value","key":"value"}
json数组的表现结构:
value可以是多种类型
[{ "key":"value","key":"value"},{ "key":"value","key":"value"},"abc"]
数值型
-3、3.5 、3.5e+5、5e-7、2e2合法
- JSON语法测试
要将java对象转换成json对象,必须依赖一些jar包
json-lib-2.4-jdk1.5.jar所需要的全部jar包(6个)
commons-beanutils-1.8.0.jar
commons-collections-3.2.1.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
ezmorph-1.0.6.jar
json-lib-2.4-jdk15.jar
新建JUint Test Case ,类名自定义
package cn.jxy.json;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JSONSerializer;
import net.sf.json.JsonConfig;
import net.sf.json.util.CycleDetectionStrategy;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class JSONTest {
private static Grade grade;
private static Student student;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("----测试方法执行之前执行----");
student = new Student();
grade = new Grade();
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("----测试方法执行之后执行----");
student = null;//目的:释放资源
grade = null;
}
@Test
// 测试Java对象转成Json的格式
public void test() {
grade.setId(1);
grade.setName("java net");
System.out.println(JSONSerializer.toJSON(grade));
}
@Test
// 测试数组的JSON表现形式
public void test2() {
grade.setId(1);
grade.setName("java");
Student student = new Student();
student.setName("小王");
student.setDate(new Date());
Student student2 = new Student();
student2.setName("小李");
student2.setDate(new Date());
List<Student> stuList = new ArrayList<Student>();
stuList.add(student);
stuList.add(student2);
grade.setStulist(stuList);
System.out.println(JSONSerializer.toJSON(grade));//日期会具体细分新的json
}
@Test // 测试static是不能转化为json属性的
public void test3() {
student.setDate(new Date());
student.setName("admin");
student.setAge(18);
System.out.println(JSONSerializer.toJSON(student));
// 如果返回的是static,或者返回的类型不确定,那么可以采用map或者自己构建json格式
JSONObject object = new JSONObject();
object.put("age", student.getAge());
object.put("date", student.getDate());
object.put("name", student.getName());
System.out.println(object.toString());
}
@Test // 解决自关联的问题
public void test4() {
student.setDate(new Date());
student.setName("admin");
//student.setStudent(new Student());
// 通过配置jsonConfig来过滤相应的参数
JsonConfig config=new JsonConfig();
// 设置需要排除哪些字段, 例如排除密码字段
config.setExcludes(new String[]{"date"});
// 设置如果有些字段是自关联则过滤 STRICT: 缺省值,是否自关联都要转化
// LENIENT: 如果有自关联对象,则值设置为null
// NOPROP: 如果自关联则忽略属性
config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
System.out.println(JSONObject.fromObject(student, config));
}
@Test // 通过自定义日期的处理类,来格式化日期数据
public void test5() {
student.setDate(new Date());
student.setName("admin");
JsonConfig config=new JsonConfig();
// 指定某个Json类型的处理方式
DataJsonValueProcessor dataValue=new DataJsonValueProcessor();
config.registerJsonValueProcessor(Date.class, dataValue);
System.out.println(JSONObject.fromObject(student, config));
}
@Test // 通过自定义日期的处理类,来格式化日期数据
public void test6() {
// JSONObject 可以自定义对象,JSONArray可以自定义数组
JSONObject obj=new JSONObject();
obj.put("id", 123);
obj.put("name","admin");
JSONObject obj2=new JSONObject();
obj2.put("id", 234);
obj2.put("name","xyz");
JSONArray array=new JSONArray();
array.add(obj);
array.add(obj2);
// 吧array对象在存储到obj对象中
JSONObject temp=new JSONObject();
temp.put("array", array); // {array:[{id:123,name:'admin'},{.....}]}
System.out.println(JSONObject.fromObject(temp));
}
}
将一个java对象转换为 json
JSONSerializer.toJSON(grade);
如果有字符串中含有特殊符号\t
前端发现\t会自动解释为tab键
- *如何转换为static字段
如果Student类中有静态属性(即用static声明的属性)
// 默认static属于类的,而非对象的.
private static Integer age;
public static Integer getAge() {
return age;
}
public static void setAge(Integer age) {
Student.age = age;
}
则在转换成json时无法识别
@Test // 测试static是不能转化为json属性的
public void test3() {
//student.setDate(new Date());
student.setName("admin");
student.setAge(18);
System.out.println(JSONSerializer.toJSON(student));
无法正常输出age字段
解决方法:
1)此方案不是很好 在web开发中会有线程安全的问题
//去掉get和set的static修饰符
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
Student.age = age;
}
可以正常转化为json
2)或者可以采用map(先行构建map,再将map转换为json)或者自己构建json格式(JSONObject–实质是一个map)
// 如果返回的是static,或者返回的类型不确定,那么可以采用map(先行构建map,再将map转换为json)或者自己构建json格式(JSONObject--实质是一个map)
JSONObject object = new JSONObject();
object.put("age", student.getAge());
object.put("date", student.getDate());
object.put("name", student.getName());
System.out.println(object.toString());
对于零散数据map格式的数据使用比较多,跟对象属是否为static没有关系
- 自关联解决方案
如果在Student类中还有一个属性(是它自己的类对象)
private Student student = this;
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Test // 解决自关联的问题
public void test4() {
student.setDate(new Date());
student.setName("admin");
System.out.println(JSONSerializer.toJSON(student));
}
此时执行会报错 net.sf.JSONException:There is acycle in the hierarchy 循环错误
解决方案
@Test // 解决自关联的问题
public void test4() {
student.setDate(new Date());
student.setName("admin");
//通过配置jsonConfig来过滤相应的参数
JsonConfig config=new JsonConfig();
// 设置需要排除哪些字段, 例如排除密码字段
config.setExcludes(new String[]{"student","date"});
JSONObject.fromObject(student,config);
System.out.println(JSONObject.fromObject(student,config).toString());
}
或者可以排除date字段
由于上述参照的是自己
private Student student = this;
但有时候
private Student student;
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
@Test // 解决自关联的问题
public void test4() {
student.setDate(new Date());
student.setName("admin");
//student.setStudent(new Student());
// 通过配置jsonConfig来过滤相应的参数
JsonConfig config=new JsonConfig();
// 设置需要排除哪些字段, 例如排除密码字段
config.setExcludes(new String[]{"date"});
// 设置如果有些字段是自关联则过滤 STRICT: 缺省值,是否自关联都要转化
// LENIENT: 如果有自关联对象(是不是this),则值设置为null
// NOPROP: 如果自关联则忽略属性(是this的话不管,没有设个属性)
config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
System.out.println(JSONObject.fromObject(student, config).toString());
}
- Date格式处理
一般通过json传递的date都是字符串,这样就避免了这种转换
new Date() 转化为json的时候会细分到时分秒
期望用年月日的形式来展示
@Test // 通过自定义日期的处理类,来格式化日期数据
public void test5() {
student.setDate(new Date());
student.setName("admin");
JsonConfig config=new JsonConfig();
// 指定某个Json类型的处理方式 不仅仅可以处理日期
DataJsonValueProcessor dataValue=new DataJsonValueProcessor();
config.registerJsonValueProcessor(Date.class, dataValue);
System.out.println(JSONObject.fromObject(student, config));
}
扩展类
public class DataJsonValueProcessor implements JsonValueProcessor {
private String format = "yyyy-MM-dd HH:mm:ss";
private SimpleDateFormat sdf = new SimpleDateFormat(format);
@Override
//针对数组
public Object processArrayValue(Object arg0, JsonConfig arg1) {
// TODO Auto-generated method stub
return null;
}
@Override
// 需要处理日期的相关格式
//针对于普通值 arg0:匹配字段date arg1:date字段的值 arg2:jsonconfig对象
public Object processObjectValue(String arg0, Object arg1, JsonConfig arg2) {
if (arg1 == null) {
return "";
} else if (arg1 instanceof Date) {
return sdf.format((Date) arg1);
}else{
return arg1.toString();
}
}
}
JSONArray的使用
JSONObject实际上是一个map,可以自定义对象,
而JSONArray可以自定义数组
可以把对象放到数组里边 也可以把数组放到对象里边@Test
public void test6() {
// JSONObject 可以自定义对象,JSONArray可以自定义数组
JSONObject obj=new JSONObject();
obj.put(“id”, 123);
obj.put(“name”,”admin”);
JSONObject obj2=new JSONObject();
obj2.put(“id”, 234);
obj2.put(“name”,”xyz”);
JSONArray array=new JSONArray();
array.add(obj);
array.add(obj2);
// 把array对象在存储到obj对象中
JSONObject temp=new JSONObject();
temp.put(“array”, array); // {array:[{id:123,name:’admin’},{…..}]}
System.out.println(JSONObject.fromObject(temp));
}