1. 程式人生 > >JSON物件、中文亂碼及時間轉換-默然說話20170331備課筆記

JSON物件、中文亂碼及時間轉換-默然說話20170331備課筆記

JSON物件(Map物件轉JSON)

  • 匯入jastjson-1.2.13.jar
  • 驗證方法
    • 返回值:Object(JSON物件)
  • @ResponseBody
    • 作用:將標註該註解的處理方法的返回結果直接寫入HTTP response Body中,一般會在非同步獲取資料時使用(ajax)
    • 注意:如果要輸出中國字,必須在控制器方法中呼叫URLEncoder.encode()方法
      • URLEncoder.encode(str, “UTF-8”);
    • 如果要輸出中國字,必須在js中呼叫decodeURI()方法
控制器端方法示例
    @RequestMapping("/checkUserName"
) @ResponseBody public Object checkUserNameExtist(String name) { Map<String, String> result = new HashMap<String, String>(); //StringUtils是com.mysql.jdbc提供的靜態類,在mysql的資料庫連線jar中 if (StringUtils.isNullOrEmpty(name)) { //如果要輸出中文資訊必須進行編碼,使用java.net.URLEncoder
.encode("中國字","UTF-8")方法 result.put("message", MyUtils.ajaxEncoding("使用者名稱已存在")); } else { Users users = usersService.findUserExist(name); if (users == null) { result.put("message", MyUtils.ajaxEncoding("使用者名稱可以使用")); } else { result.put
("message", MyUtils.ajaxEncoding("使用者名稱已存在")); } } return JSONArray.toJSONString(result); }
上面程式碼中用到的MyUtils程式碼示例
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class MyUtils {
    public static String ajaxEncoding(String str){
        try {
            str=URLEncoder.encode(str, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return str;
    }
}
jsp頁面的ajax示例,使用jquery-1.11.3
<script src="js/jquery.min.js" charset="UTF-8"></script>
    <script type="text/javascript" charset="UTF-8">
        $("#userName").bind("blur",function(){
            $.ajax({
                type:"POST",
                url:"checkUserName",
                data:{name:$("#userName").val()},
                dataType:"json",//返回值的資料型別,預設是string
                success:function(data){
                    //如果沒有指定dataType屬性為json,則需要下面程式碼把字串轉換為JSON物件
                    //data=$.parseJSON(data);
                    alert(decodeURI(data.message));
                }
            });
        });
    </script>

解決中文亂碼的簡單方式

  • 使用@RequestMapping的produces屬性
    • 簡單方便,但每次用都要配置
  • 裝配StringHttpMessageConverter,設定編碼為UTF-8
    • supportedMediaTypes屬性
      • 指定媒體型別:application/json
      • 字元編碼:UTF-8
    • 一次配置,永久搞定
使用@RequestMapping
@RequestMapping(value="/displayUserInfo",method=RequestMethod.GET,produces="{application/json;charset=UTF-8}")
裝配StringHttpMessageConverter
<mvc:annotation-driven >
                <mvc:message-converters>
                    <!-- 解決ajax中文亂碼問題 -->
                    <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                        <property name="setSupportedMediaTypes" >
                            <list>
                                <value>application/json;charset=UTF-8</value>
                            </list>
                        </property>
                    </bean>
                </mvc:message-converters>
        </mvc:annotation-driven>

解決時間物件轉JSON時間的格式問題

  • 在實體類的屬性上加@JSONField(format=”yyyy-MM-dd”)
    • 侵入性強,強耦合,不建議使用
@JSONField(format="yyyy-MM-dd")
  • 配置FastJson的訊息轉換器-FastJsonHttpMessageConvertor
    • 配置於中
    • 在配置之後,不需要在程式碼中寫JSONArray.toJSONString(user)的程式碼了,直接返回實體物件即可
    • 只有預設的返回日期格式(不能更改麼?!)
    • 如果要改,只能使用註解@JSONField來更改
 <mvc:annotation-driven >
    <mvc:message-converters>
        <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>text/html;charset=UTF-8</value>
                    <value>application/json</value>
                </list>
            </property>
            <property name="features">
                <list>
                    <value>WriteDateUseDateFormat</value>
                </list>
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>
  • 自定義FastJson訊息轉換器(坑爹,視訊不講了,讓自己的去解決)