1、语言的数据类型
虽然数据在底层都以字节的形式运算、存储和传输,但为了程序易于理解,所有的高级语言都有自己的数据类型,比如字符串、数字、布尔等。
对于面向对象的语言,几乎都有“对象”这个封装类型,这个抽象的类型只限于自己语言之内解析,比如Java对象之与JVM,js对象之与浏览器等。
数据在跨平台交互时,离不开"字符串”这个类型,为了解析效率和易读性,字符串往往都有一定的格式,比如字符串中使用“&”分隔符,到后来业界有了xml、json等。
2、Json字符串与Json对象
Json只是一种数据格式,没有语言之分,字符串和对象是两种不同的数据类型。
2.1、Javascript下的Json
var person1 = '{ "name": "wangxu", "age": 27 }'; //字符串类型
var person2 = { "name": "wangxu ", "age": 27 }; //对象类型,比上面少了引号
如果person1不进行类型转换,想取age值,只能使用js的split或者substring,这显然是反人类的。
但想取person2的age,直接使用person2.age即可,这就是语言“对象”类型的魔力。
Json格式的js字符串类型与对象类型的转换
字符串-->对象:
person2=JSON.parse(person1);
或者 eval('('+person1+')')
对象-->字符串:
person1=JSON.stringify(person2)
2.2、Java下的Json
Json格式的Java字符串类型与对象类型及其转换如下:
public class TestJsonConvert {
public static void main(String[] args) {
//字符串
String person1="{\"name\":\"wangxu\",\"age\":27}";
//对象
Person person2=new Person("wangxu",27);
//转换:字符串-->对象
person2=com.alibaba.fastjson.JSON.parseObject(person1, Person.class);
//转换:对象-->字符串
person1=com.alibaba.fastjson.JSON.toJSONString(person2);
}
static class Person {
private String name;
private Integer age;
public Person() { }
public Person(String name, Integer age) {
this.name = name; this.age = age;
}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }}
}
2.3、浏览器与Java web的Json交换
浏览器到后台:将Json格式的js对象转换成js字符串后发送,servlet接收后再将字符串转换成Java对象。
后台到浏览器:将Json格式的Java对象转换成字符串后输出,浏览器接受字符串后,可以将其转换成js对象类型。
关于java web输出json字符串的简单总结:[
java web返回json无外乎最原始的输出,和使用框架封装自动输出
一、使用HttpServletResponse直接输出
method如下:
/**
* 直接使用HttpServletResponse输出json串
*
* @param
* @return
* @throws IOException
*/
public void getJson(HttpServletResponse response) throws IOException {
reresponse.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=UTF-8");
PrintWriter out = response.getWriter();
Object obj=new Object();//JavaBean
String json=JSON.toJSONString(obj); //这里使用阿里的fastjson
out.print(json);
out.flush();
out.close();
}
二、使用框架自动将JavaBean转成Json输出
这里列举spring mvc3的实现方式,需要引入对应的jackson包
i)、请求method添加@ResponseBody后直接返回JavaBean对象如下
/**
* 使用@ResponseBody返回json
* spring 调用jackson将Object自动转json并输出
* @param
* @return
* @throws IOException
*/
@RequestMapping(value = "/json", method = RequestMethod.GET)
@ResponseBody
public Object getJson(HttpServletResponse response) throws IOException {
Object obj = new Object();// JavaBean
return obj;
}
ii)、spring-mvc.xml的配置如下
<!-- 请求方法映射 -->
<mvc:annotation-driven
ignore-default-model-on-redirect="true">
<!-- 识别@ResponseBody后,将javaBean自动转json -->
<mvc:message-converters>
<bean
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
]
注意事项:
前端Ajax请求后端返回Json时,注意至少有一端要设置数据格式为Json,不然返回的data默认是"Json字符串",还得手工转换成“Json对象”
前台请求时设置 dataType:"json";
后台响应时设置 response.setContentType("application/json;charset=UTF-8");