1. 程式人生 > 其它 >[SpringMVC 03] json

[SpringMVC 03] json

SpringMVC 03


1. JSON格式

後端留介面傳資料 --- json格式 ---- 前端獨立部署渲染資料

JSON:JavaScript Object Notation,js物件標記, 是一種輕量級的資料交換格式,

採用完全獨立於程式語言的文字格式儲存和表示資料, 有效提升網路傳輸效率


是JS物件的字串表示,本質是一個字串

語法格式:

  • 物件表示為鍵值對,資料用逗號分隔
  • 花括號儲存物件
  • 方括號儲存陣列

eg:單個物件{"id":1,"age":3,"name":"roy"}

集合物件: [{"id":1,"age":3,"name":"roy"}, {"id":1,"age":3,"name":"roy"}]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script type="text/javascript">
        var user = {
            name : "Roy",
            age:3,
            sex:"boy"
        }
        var userString = JSON.stringify(user);//把一個js物件轉換成JSON格式
        console.log(userString);
        console.log(“============”);
        var userAgain = JSON.parse(userString);//把一個JSON字串轉換成前端物件
        console.log(userAgain);
    </script>
</head>
<body>
</body>
</html>

2. JSON解析

(使用包:Jackson或谷歌的gson)

作用: 把物件解析為json格式傳送給前端

1. 直接返回字串

寫user(id, age, name)實體類,並寫controller:

@ResponseBody 註解表示直接返回字串內容,而不經過檢視解析器

@Controller
public class UserController {
    @RequestMapping("/t1")
    @ResponseBody
    public String json1(){
        User user = new User(1, 3, "roy");
        return user.toString();
    }
}

2. Jackson返回json字串&亂碼

如果是後新增的webapp支援,記得更新lib依賴包

@Controller
public class UserController {
    @RequestMapping("/t1")
    @ResponseBody
    public String json_test() throws JsonProcessingException {
        User user = new User(1, 3, "roy");
        ObjectMapper objectMapper = new ObjectMapper();//new 一個ObjectMapper
        String str = objectMapper.writeValueAsString(user);//呼叫writeValueAsString(物件)
        return str;
    }
}

返回為:{"id":1,"age":3,"name":"roy"}

亂碼問題: 要麼走filter, 要麼@RequestMapping寫:

@RequestMapping(value="/t1", produces = "application/json;charset=utf-8")

後者在springmvc-servlet.xml中配置:

<mvc:annotation-driven>
	<mvc:message-converters register-defaults="true">
		<bean class="org.springframework.http.converter.StringHttpMessageConverter">
			<constructor-arg value="UTF-8"/>
		</bean>
		<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
			<property name="objectMapper">
				<bean class="org.springframework.http.converter.json.Jackson20bjectMapperFactoryBean">
					<property name="failOnEmptyBeans" value="false"/>
				</bean>
			</property>
		</bean>
	</mvc:message-converters>
</mvc:annotation-driven>

如果是前後端分離,一般都返回json字串,而不經過檢視解析器;所以在Controller類前面直接定義:

@RestController來代替@ControllerRestController只返回字串。

如果類寫@Controller, 下面的方法如果要不走檢視解析器,方法要註解@ResponseBody;

如果類寫@RestController, 則下面的方法都只返回字串,

方法上的@RequestMapping("/路徑")是用來指定訪問的

3. 返回時間

方式一:java中用傳統方式設定顯示:

@RequestMapping(value="/t2")
@ResponseBody
public String json2() throws JsonProcessingException {
    Date date = new Date();
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    return simpleDateFormat.format(date);
}

方式二:使用jackson的方式

@RequestMapping(value="/t2")
@ResponseBody
public String json2() throws JsonProcessingException {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);//設定不走時間戳
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    objectMapper.setDateFormat(simpleDateFormat);//設定objectMapper的格式
    Date date = new Date();
    return objectMapper.writeValueAsString(date);
}