SpringMVC:JSON

39030 ワード

SpringMVC:JSON解説
 
JSONとは
JSON(JavaScript Object Notation、JSオブジェクトマーク)は、軽量級のデータ交換フォーマットで、現在は特に広く使われています.プログラム言語とは完全に独立したテキスト形式を使用して、データを格納し、表示します.簡潔で明瞭な階層構造はJSONを理想的なデータ交換言語にする.読みや編纂が容易であり、機械解析や生成も容易であり、効率的にネットワーク伝送を向上させる.JavaScript言語では、すべて対象です.したがって、どのようなJavaScriptでもサポートされているタイプは、文字列、数字、オブジェクト、配列などのJSONによって表されてもよい.彼の要求と文法のフォーマットを見てください.
オブジェクトはキーパッドペアとして表示され、データはカンマ区切りかっこ保存オブジェクト大かっこ保存配列JSONキーの値はJavaScriptオブジェクトを保存するための方法です.JavaScriptオブジェクトの書き方も大同小異です.キー/値はグループのキー名に対して前に書いて、ダブルクォーテーションマークで包んで、コロンを使います.
{"name": "QinJiang"}
{"age": "3"}
{"sex": " "}
多くの人はJSONとJavaScriptの対象の関係がよく分かりません.誰が誰なのかさえ分かりません.実は、このように理解できます.
JSONはJavaScriptオブジェクトの文字列表示法で、テキストを使ってJSオブジェクトの情報を表しています.本質は文字列です.
var obj = {a: 'Hello', b: 'World'}; //      ,               
var json = '{"a": "Hello", "b": "World"}'; //     JSON    ,        
JSONとJavaScriptのオブジェクトは互いに回転します.
JSON文字列からJavaScriptオブジェクトに変換するために、JSON.parseを使用する方法:
var obj = JSON.parse('{"a": "Hello", "b": "World"}'); 
//    {a: 'Hello', b: 'World'}
JavaScriptオブジェクトからJSON文字列に変換するために、JSON.strigifyを使用する方法:
var json = JSON.stringify({a: 'Hello', b: 'World'});
//    '{"a": "Hello", "b": "World"}'
コードテスト
新しいmodule、springmvc-05-json、webのサポートを追加します.
webディレクトリの下にjson-1を新設し、試験内容を作成する

<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSON_  title>
head>
<body>

<script type="text/javascript">
//    js   
var user = {
 name:"  ",
 age:3,
 sex:" "
};
// js     json   
var str = JSON.stringify(user);
console.log(str);

// json      js  
var user2 = JSON.parse(str);
console.log(user2.age,user2.name,user2.sex);

script>

body>
html>
.
IDEAでブラウザを使って開き、コンソール出力を確認します.ControllerはJSONデータに戻ります.
Jacksonは現在の比較的良いjson解析ツールであるべきです.
もちろん工具はこれだけではないです.例えばアリババのfastjsonなどがあります.私達はJacksonを使って、そのjarカバンを導入したいです.

<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-databindartifactId>
    <version>2.9.8version>
dependency>
SpringMVCの配置に必要な配置web.xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    
    <servlet>
        <servlet-name>SpringMVCservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        
        <init-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>classpath:springmvc-servlet.xmlparam-value>
        init-param>
        
        <load-on-startup>1load-on-startup>
    servlet>

    
    <servlet-mapping>
        <servlet-name>SpringMVCservlet-name>
        <url-pattern>/url-pattern>
    servlet-mapping>

    <filter>
        <filter-name>encodingfilter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
        <init-param>
            <param-name>encodingparam-name>
            <param-value>utf-8param-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>encodingfilter-name>
        <url-pattern>/url-pattern>
    filter-mapping>

web-app>
スプリングmvc-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    
    <context:component-scan base-package="com.kuang.controller"/>

    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
          id="internalResourceViewResolver">
        
        <property name="prefix" value="/WEB-INF/jsp/" />
        
        <property name="suffix" value=".jsp" />
    bean>

beans>
私達は勝手にUserの実体類を編纂して、それから私達は私達のテストControllerを編纂します.
package com.kuang.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//    lombok
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private String name;
    private int age;
    private String sex;
    
}
ここでは二つの新しいものが必要です.一つは@ResonseBodyです.一つはObject Mapperオブジェクトです.具体的な使い方を見てみます.
Controllerを作成する.
@Controller
public class UserController {

    @RequestMapping("/json1")
    @ResponseBody
    public String json1() throws JsonProcessingException {
        //    jackson      ,      
        ObjectMapper mapper = new ObjectMapper();
        //      
        User user = new User("  1 ", 3, " ");
        //          json  
        String str = mapper.writeValueAsString(user);
        //  @ResponseBody  ,    str  json    ;    
        return str;
    }

}
Tomcatを設定して、テストを開始します.http://localhost:8080/json1
文字化けの問題が発見されました.彼の符号化フォーマットはutf-8であり、戻りのタイプを設定したいです.コード
//produces:            
@RequestMapping(value = "/json1",produces = "application/json;charset=utf-8")
は、@Request Mapingのproduces属性によって実装される.
再度テストします http://localhost:8080/json1 文字化け問題OK!==【注意:jsonを使って文字化けの問題を覚えてください】==
コードの最適化
文字化け統一解決
前の方法は比較的に面倒で、もしプロジェクトの中で多くの要求があるならば、すべて追加して、Spring配置を通して統一的に指定することができて、このように毎回すべて処理しなくてもいいです!
springmvcのプロファイルにStringHttp Message Coverter変換プロファイルを追加できます.
<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.Jackson2ObjectMapperFactoryBean">
                    <property name="failOnEmptyBeans" value="false"/>
                bean>
            property>
        bean>
    mvc:message-converters>
mvc:annotation-driven>
Json文字列を返します.
クラスで直接使用する @Reset Controller ,このように、中のすべての方法はjson文字列に戻ります.もうどれも@ResonseBodyを追加しなくてもいいです.私達は前後の端で分離開発しています.普通は@RertControllerを使っています.とても便利です.
@RestController
public class UserController {

    //produces:            
    @RequestMapping(value = "/json1")
    public String json1() throws JsonProcessingException {
        //    jackson      ,      
        ObjectMapper mapper = new ObjectMapper();
        //      
        User user = new User("  1 ", 3, " ");
        //          json  
        String str = mapper.writeValueAsString(user);
        //  @ResponseBody  ,    str  json    ;    
        return str;
    }

}
tomcatテストを起動して、結果は正常に出力されます.
テストセット出力
新しい方法を追加します.
@RequestMapping("/json2")
public String json2() throws JsonProcessingException {

    //    jackson      ,      
    ObjectMapper mapper = new ObjectMapper();
    //      
    User user1 = new User("  1 ", 3, " ");
    User user2 = new User("  2 ", 3, " ");
    User user3 = new User("  3 ", 3, " ");
    User user4 = new User("  4 ", 3, " ");
    List list = new ArrayList();
    list.add(user1);
    list.add(user2);
    list.add(user3);
    list.add(user4);

    //          json  
    String str = mapper.writeValueAsString(list);
    return str;
}
運行結果:完璧です.何の問題もありません.
出力時間オブジェクト
新しい方法を追加します.
@RequestMapping("/json3")
public String json3() throws JsonProcessingException {

    ObjectMapper mapper = new ObjectMapper();

    //        ,java.util.Date
    Date date = new Date();
    //          json  
    String str = mapper.writeValueAsString(date);
    return str;
}
実行結果:
標準の日付書式は数字になります.1970年1月1日から現在の日付までのミリ秒数です.Jacksonはデフォルトでは時間をtimestamps形式に変えます.
ソリューション:timestamps形式をキャンセルし、時間の書式をカスタマイズします.
@RequestMapping("/json4")
public String json4() throws JsonProcessingException {

    ObjectMapper mapper = new ObjectMapper();

    //         
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    //         
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    //      
    mapper.setDateFormat(sdf);

    Date date = new Date();
    String str = mapper.writeValueAsString(date);

    return str;
}
運転結果:時間の出力に成功しました.
抽出ツール類
よく使うなら、このようにするのは面倒くさいです.これらのコードを一つのツールに入れることができます.私達は編集に行きます
package com.kuang.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.text.SimpleDateFormat;

public class JsonUtils {
    
    public static String getJson(Object object) {
        return getJson(object,"yyyy-MM-dd HH:mm:ss");
    }

    public static String getJson(Object object,String dateFormat) {
        ObjectMapper mapper = new ObjectMapper();
        //         
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        //         
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        //      
        mapper.setDateFormat(sdf);
        try {
            return mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }
}
私達はツール類を使って、コードは更に簡潔になりました.
@RequestMapping("/json5")
public String json5() throws JsonProcessingException {
    Date date = new Date();
    String json = JsonUtils.getJson(date);
    return json;
}
大仕事が完成するパーフェクト
FastJson
fastjson.jarはアリが開発したJava開発用のカバンで、JsonオブジェクトとJavaBeanオブジェクトの変換を簡単に実現できます.JavaBeanオブジェクトとjson文字列の変換を実現し、jsonオブジェクトとjva文字列の変換を実現します.jsonを実現する変換方法はとても多くて、最後の実現結果はすべて同じです.
fastjsonのpom依存!
<dependency>
    <groupId>com.alibabagroupId>
    <artifactId>fastjsonartifactId>
    <version>1.2.60version>
dependency>
fastjsonの三つの主要な種類:
【JSONObject代表json対象】
JSONObjectはMapインターフェースを実現しました.JSONObjectの底の操作はMapによって実現されると予想しています.JSONObjectはjsonオブジェクトに対応しており、様々な形のget()によりjsonオブジェクト中のデータを取得することができ、size()、isEmpty()などの方法で「キー:値」ペアの個数と判定が空かどうかを取得することもできます.その本質は,Mapインターフェースを実現し,インターフェース内の方法を呼び出すことによって達成される.【JSONArrayはJsonオブジェクト配列を表す】
内部にはListインターフェース内の方法があり、操作を完了します.【JSON代表JSONObjectとJSONArrayの転化】
JSONのソースコードの分析と使用
これらの方法を注意深く観察すると、主にjsonオブジェクト、jsonオブジェクト配列、javabeanオブジェクト、json文字列間の相互変換が実現されます.コードテストは、FastJson Demoクラスを新設します.
package com.kuang.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.kuang.pojo.User;

import java.util.ArrayList;
import java.util.List;

public class FastJsonDemo {
    public static void main(String[] args) {
        //      
        User user1 = new User("  1 ", 3, " ");
        User user2 = new User("  2 ", 3, " ");
        User user3 = new User("  3 ", 3, " ");
        User user4 = new User("  4 ", 3, " ");
        List list = new ArrayList();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        list.add(user4);

        System.out.println("*******Java     JSON   *******");
        String str1 = JSON.toJSONString(list);
        System.out.println("JSON.toJSONString(list)==>"+str1);
        String str2 = JSON.toJSONString(user1);
        System.out.println("JSON.toJSONString(user1)==>"+str2);

        System.out.println("
****** JSON Java *******"
); User jp_user1=JSON.parseObject(str2,User.class); System.out.println("JSON.parseObject(str2,User.class)==>"+jp_user1); System.out.println("
****** Java JSON ******"
); JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2); System.out.println("(JSONObject) JSON.toJSON(user2)==>"+jsonObject1.getString("name")); System.out.println("
****** JSON Java ******"
); User to_java_user = JSON.toJavaObject(jsonObject1, User.class); System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>"+to_java_user); } }
このようなツール類は、私達は使うことを身につけるだけでいいです.使う時は具体的な業務によって対応の実現を探します.昔のcommons-inoのようなツールバッグと同じように、持ってきて使えばいいです.
記事の起源はhttps://blog.kuangstudy.com/index.php/archives/480/このブログの主、権利侵害は削除に連絡してください.
https://blog.kuangstudy.com/index.php/archives/480/