JSON详解
所需jar包以及实例代码下载地址:链接:http://pan.baidu.com/s/1hrDMsp2 密码:417t
一、Json基础
(1)、JSON格式:
表示名称 / 值对
按照最简单的形式,可以用下面这样的 JSON 表示 "名称 / 值对" : { "firstName": "Brett" }这个示例非常基本,而且实际上比等效的纯文本 "名称 / 值对" 占用更多的空间:firstName=Brett
但是,当将多个"名称 / 值对"串在一起时,JSON 就会体现出它的价值了。首先,可以创建包含多个"名称 / 值对"的 记录,比如:
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }
从语法方面来看,这与"名称 / 值对"相比并没有很大的优势,但是在这种情况下 JSON 更容易使用,而且可读性更好。例如,它明确地表示以上三个值都是同一记录的一部分;花括号使这些值有了某种联系。
表示数组
当需要表示一组值时,JSON 不但能够提高可读性,而且可以减少复杂性。例如,假设您希望表示一个人名列表。在 XML 中,需要许多开始标记和结束标记;如果使用典型的 名称 / 值 对(就像在本系列前面文章中看到的那种名称 / 值对),那么必须建立一种专有的数据格式,或者将键名称修改为 person1-firstName这样的形式。
如果使用 JSON,就只需将多个带花括号的记录分组在一起:
{ "people": [
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"},
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
]}
(2)后台编写JSON代码所需要的jar包
(3)、JSON的优缺点
优点:
对于JSON,首先要明白JSON和XML一样也是一种简单文本格式。相对于XML,它更加易读、更便于肉眼检查。在语法的层面上,JSON与其他格式的区别是在于分隔数据的字符,JSON中的分隔符限于单引号、小括号、中括号、大括号、冒号和逗号。
缺点:
和许多好东西都具有两面性一样,JSON的非冗长性也不例外,为此JSON丢失了XML具有的一些特性。命名空间允许不同上下文中的相同的信息段彼此混合,然而,显然在JSON中已经找不到了命名空间。JSON与XML的另一个差别是属性的差异,由于JSON采用冒号赋值,这将导致当XML转化为JSON时,在标识符(XML CDATA)与实际属性值之间很难区分谁应该被当作文本考虑。
二、其他类型数据转JSON格式
(1)、List转JSON
下面代码可以当做工具方法,传入的list的类型给定义了<T>泛型,理论上可以传入任何类型的集合类型,包括下面要说的实体类和Map也都可以eg:List<Map>、List<JavaBean>
/**
* list转换成JSONArray,传入的list集合可以是任何类型的。
*
* @param list
* :传入的list可以是任何类型的集合,集合类型的实体类也能传入
* @return JSONArray
*/
public static <T> JSONArray listToJson(List<T> list) {
JSONArray ja = JSONArray.fromObject(list);
return ja;
}
(2)、实体类转JSON
/**
* 实体类转换成JSON
*
* @param t
* 实体类
* @return JSONObject
*/
public static <T> JSONObject beanToJson(T t) {
JSONObject jsonObject = JSONObject.fromObject(t);
return jsonObject;
}
(3)Map转JSON
/**
* Map 转换成Json
*
* @param map
* @return JSONObject
*/
public static JSONObject mapToJson(Map<String, Object> map) {
JSONObject json = JSONObject.fromObject(map);
return json;
}
(1)后台向前台传值以及前台接收的方法
前台采用的是ajax回调后台相应json格式字符串的方式。
function jsonTest(){
/*1、dataType : 'json',将后台获取的json格式字符串转换成了json格式数据,因此前台不需要再做转换 ,直接data.key就可以得到相应的value
2、通过ajax回调的方法一定不能是放回一个jsp,小白之前办过这么蠢的事,返回了一个jsp页面结果就是获取不到任何值也不报任何错误。
3、
*/
debugger;
jQuery.ajax({
url:'<%=request.getContextPath()%>/javalearn/json',
method : 'POST',
dataType : 'json',
success : function(data) {
alert(data.message);
}
});
}
后台代码:
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import net.sf.json.JSONObject;
/**
* 后台json学习代码
* 知识点
* 1、后台List,实体类、Map转Json格式,参考文章前几节
* 2、@RequestMapping(value = "/json", produces = "application/json;charset=utf-8")
* 注解中解决后台向前台传值中文乱码 ,方法返回的是json格式的字符串,如果返回的是个jsp页面则需要在方法中添加 resp.setContentType("text/html;charset=utf-8");代码即可。
* @author lyd
*
*/
@Controller
@RequestMapping(value = "/javalearn")
public class JavaLearnController {
/**
*
* @param req
* @param resp
* @return json格式的字符串
*/
@RequestMapping(value = "/json", produces = "application/json;charset=utf-8")
@ResponseBody
public String jsonLearn(HttpServletRequest req, HttpServletResponse resp) {
// resp.setContentType("text/html;charset=utf-8");
Map<String, Object> map = new HashMap<String, Object>();
map.put("success", true);
map.put("message", "操作成功!");
JSONObject jsonObject = JSONObject.fromObject(map);
return jsonObject.toString();
}
}
运行结果:
如果没有定义dataType:'json'可以使用JSON.parse()对json格式的字符串进行解析
(2)、前台向后台传输
前台的json需要转化成字符串传输到后台,然后后台将接收的字符串再转换成json就可以。传输字符串的话比较简单,小白就不多说了。后台解析json格式的字符串代码如下
String jsonStr=request.getParameter("happy");
JSONArray json=JSONArray.fromObject(jsonStr);