您的位置:首页 > Web前端 > JavaScript

JSON

2016-01-18 16:45 741 查看

JSON:

JavaScript Object Natation:JavaScript的对象表现形式,一种轻量级的数据交换格式。
特点:完全独立于语言的文本格式,跨平台,有结构,方便人和机器解析。
使用场景:不同语言之间的传递

Json与Xml、Properties的区别:

Json是轻量级,Xml是重量级,xml一般用于框架配置
Json是有结构的, 但是Properties仅仅key-value

Json的格式:

An object is an unordered set of
name/value pairs. An object begins with { (left brace) and
ends with } (right brace).
Each name is followed by : (colon) and
the name/value pairs are separated by , (comma).



An array is an ordered collection of values. An array begins with [ (left bracket) and ends with ] (right bracket).
Values are separated by , (comma).



A value can be a string in double quotes, or a number, or true or false or null, or
an object or an array. These structures can be nested.



A string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes. A character is represented as a single character string. A string is very much like a C or Java
string.



A number is very much like a C or Java number, except that the octal and hexadecimal formats are not used.



使用Jar包:

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

测试Java对象转成Json的格式:

<span style="white-space:pre">	</span>@Test
public void test() {
grade.setId(1);
grade.setName("繁花似锦");
System.out.println(JSONSerializer.toJSON(grade));
}

输出:{"id":1,"name":"繁花似锦","students":[]}

测试数组的JSON表现形式:
<span style="white-space:pre">	</span>@Test
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.setStudents(stuList);
System.out.println(JSONSerializer.toJSON(grade));
}

输出:{"id":1,"name":"java","students":[{"age":0,"date":{"date":18,"day":1,"hours":16,"minutes":41,"month":0,"seconds":48,"time":1453106508661,"timezoneOffset":-480,"year":116},"name":"小王"},{"age":0,"date":{"date":18,"day":1,"hours":16,"minutes":41,"month":0,"seconds":48,"time":1453106508661,"timezoneOffset":-480,"year":116},"name":"小李"}]}

测试static是不能转化为json属性的:
package com;

import java.util.Date;

public class Student {
private String name;
private Date date;
private <span style="color:#ff0000;">static </span>int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public <span style="font-family: Arial, Helvetica, sans-serif;"><span style="color:#ff0000;">static </span></span><span style="font-family: Arial, Helvetica, sans-serif;">int getAge() {</span>
return age;
}
public static void setAge(int age) {
Student.age = age;
}

}
1、将get的static去掉
public <span style="font-family: Arial, Helvetica, sans-serif;"><span style="color:#ff0000;"><del>static </del></span></span><span style="font-family: Arial, Helvetica, sans-serif;">int getAge() {</span>
2、 如果返回的是static,或者返回的类型不确定,那么可以采用map或者自己构建json格式
<span style="white-space:pre">		</span>JSONObject obj = new JSONObject();
obj.put("age", student.getAge());
obj.put("name", student.getName());
obj.put("date", student.getDate());
System.out.println(obj.toString());

输出:{"age":12,"name":"ad","date":{"date":18,"day":1,"hours":16,"minutes":40,"month":0,"seconds":48,"time":1453106448797,"timezoneOffset":-480,"year":116}}

解决自关联:

package com;

import java.util.Date;

public class Student {
private String name;
private Date date;
private int age;
<span style="color:#ff0000;">private Student student = this;</span>
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}

}


<span style="white-space:pre">	</span>@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));
}
输出:
NOPROP:{"age":12,"name":"ad"}
STRICT:
LENIENT:{"age":12,"name":"ad","student":null}

通过自定义日期的处理类,来格式化日期数据

创建类实现JsonValueProcessor接口:
package com;

import java.text.SimpleDateFormat;
import java.util.Date;

import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonValueProcessor;

public class DateJsonValueProcessor implements JsonValueProcessor {

@Override
public Object processArrayValue(Object arg0, JsonConfig arg1) {
return null;
}

/**
* arg0:属性名
* arg1:转换对象
* arg2:JSON数据转换配置
*/
@Override
public Object processObjectValue(String arg0, Object arg1, JsonConfig arg2) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm");
return sdf.format((Date)arg1);
}

}


@Test // 通过自定义日期的处理类,来格式化日期数据
public void test6() {
student.setDate(new Date());
student.setName("admin");
JsonConfig config=new JsonConfig();
// 指定某个Json类型的处理方式
DateJsonValueProcessor processor = new DateJsonValueProcessor();
config.registerJsonValueProcessor(Date.class, processor);
System.out.println(JSONObject.fromObject(student, config));
}


输出:
{"age":0,"date":"2016-01-18 04:35","name":"admin"}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: