导入依赖
Jackson spr ingMVC默认的Json解决方案选择是Jackson, 所以只需要导入jackson的jar,即可使用。<br>
<dependency><br><groupId>com. fasterxml. jackson . core</groupId><br><artifactId>j ackson-databind</artifactId><br><version>2.9.8</version><br></dependency><br>
使用@ResponseBody
@RequestMapping(" /test1")<br>@ResponseBody //将handler的返回值, 转换成json(jackson) ,并将json响应给客户端。<br>public User hel1o1(){<br>System . out. println("he1lo world");<br>User user = new<br>User();<br>return user ;<br>}<br>
// @ResponseBody还可以用在handler的返回值 上<br>@RequestMapping(" /test2" )<br>public @ResponseBody List<User> hello2(){<br>System . out. println("hello world");<br>List<User> users = Arrays. asList(new User(),new User());<br>return users ;<br>}<br>
//如果返回值已经是字符串,则不需要转json,直接将字符串响应给客户端<br>@RequestMapping(value= " /test3" , produces =“ text/html ;charset=utf-8") //produces 防止中文乱码<br>@ResponseBody<br>public String hello2(){<br>System . out. println("hello world");<br>return "你好";<br>}<br>
使用@RestController
Controller类上加了@RestController注解,等价于在类中的每个方法上都加了@ResponseBody<br>
@Controller<br>@RestController<br>public class JsonController{<br>@RequestMapping(" /test1")<br>public User hello1(){<br>System . out. println("hello world");<br>User user = new User();<br>return user ;<br>}<br>/ /@Re sponseBody还可以用在handler的返回值上<br>@RequestMapping(" /test2" )<br>public List<User> he1lo2(){<br>System. out . println("hello world");<br>List<User> users = Arrays. asList(new User(),new User());<br>return users;<br>
使用@RequestBody
1.定义handler
class User{<br>private Integer id;<br>private String name;<br>private Boolean gender ;<br>//set get<br>}<br>@RequestMapping(" /users")<br>public String addUser(@RequestBody User user){/ /@RequestBody将请求体中的j son数据转换为java对象<br>System. out. println("cap2");<br>System . out . println("Post user :"+user);<br>return "index" ;<br>}<br>
2.Ajax发送json
var xhr = new XMLHttpRequest();<br>xhr . open(“post"," $ {pageContext . request . contextPath}/users?"+new Date() . getTime());<br>xhr . setRequestHeader(" content- type" , "application/json");//设置请求头<br>xhr . send(' {"id" :1,"name" :" shine",“gender":"true"}');//传递json串<br>//ajax<br>var user = {id:1, name:"shine"};<br>$.ajax({<br>url:'${pageContext . request . contextPath}/json2/test4',<br>type:'post',<br>contentType:"application/json",//声明请求参数类型为json<br>data:JSON. stringify(user),//转换js对象成json<br>success :function(ret){<br>console.1og(ret);<br>});<br>
Jackson常用注解
日期格式化
@JsonFormat(pattern-="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")<br>
public class User{<br>private Integer id;<br>private String name;<br>@JsonFormat( pattern= "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8" )<br>private Date birth;<br>get/set<br>}<br>
属性名修改
@JsonProperty("new_ name")<br>
public class User{<br>@JsonProperty("new_ id") //不再使用原属性名,而是"new_ .id"<br>private Integer id;<br>private String name ;<br>get/set<br>}<br>输出的json: {"new_ id" :xx, "name":"xx"}<br>
属性忽略
@JsonIgnore
public class User{<br>private Integer id;<br>@JsonIgnore //生成j son时,忽略此属性<br>private String name;<br>get/set<br>}<br>输出json时: {"id" :xx}<br>
null和empty属性排除
Jackson默认会输出null值的属性,如果不需要,可以排除。<br>
@Jsonlnclude(JsonInclude.Include.NON_ NULL) /ull值属性不输出@JsonIncludel(value= Jsonlnclude.Include.NON EMPTY) // empty属性<br>不输出(空串,长度为0的集合,null值)<br>
public class User{<br>private Integer id;<br>@JsonInclude( JsonInclude . Include . NON NULL) // 若”name==null"忽略此属性<br>private String name;<br>@JsonInclude( value= JsonInclude . Include . NON_ EMPTY) // 若hobby长度 为0或==null忽略此属性<br>private List<String> hobby;<br>get/set<br>如果name=null,且hobby长度为0, 则输出json时: {"id" :xx}<br>
自定义序列化
@JsonSerialize(using = MySerializer.class) //使用MySerializer输出某属性<br>
public class User {<br>private Integer id; <br>private String name;<br>@JsonSerialize(using = MySerializer .class)<br>private Double salary = 10000 .126;//在输出此属性时,使用MySerializer输出<br>get/set<br>则输出json时: {"id" :xx, "name" :"xxX", "salary" :10000.13}<br>
public class MySerializer extends JsonSerializer<Double> {<br>// value即Double salary的值<br>@Override <br>public void serialize(Double value, JsonGenerator gen,SerializerProvider serializers) throws IOException {<br>//将Double salary的值 四舍五入<br>String number = BigDecimal . value0f (value) . setScale(2,BigDecimal . ROUND HALF UP) . toString();<br>//输出四舍五入后的值<br>gen. writeNumber (number);<br>
FastJson
导入依赖
<dependency><br><groupId>com. alibaba< /groupId><br><artifactId>fastjson< /artifactId><br><version>1 .2. 54</version><br></dependency><br>
安装FastJson
<MVc :annotation-dr iven><br><!-- 安装FastJson,转换器--><br><mVc :message - converters><br><bean class= “com. alibaba . fastj son . support . spring. FastJsonHttpMessageConverter"><br><!--声明转换类型:json --><br><property name=" supportedMediaTypes"><br><list><br><value>application/json< /value><br></list><br></property><br>< /bean><br>< /mvc :message- converters><br>< /mvc : annotation-dr iven><br>
使用
@ResponseBody @RequestBody @RestController使用方法不变<br>
常用注解
日期格式化
@JSONField(format*"yyy/MM/dd")<br>
属性名修改
@JSONField(name="birth")<br>
忽略属性
@JSONField(serialize = false)<br>
包含null值
@JSONField(serialzeFeatures = SerializerFeature.WriteMapNullValue)默认会忽略所有null值,有此注解会输出null<br>
@JSONField(serialzeFeatures = SerializerFeature.WriteNullStringAsEmpty) null的String输出为""<br>
自定义序列化
@JSONField(serializeUsing = MySerializer2.class)<br>