SpringBootシリーズの戻りJSONデータ及びフォーマットパッケージ


主な内容:
Controllerで@RestController注記を使用してJson形式のデータを返します.
Spring Bootでデフォルトで使用されているJson解析技術フレームワークはjacksonjacksonにおけるnullの処理(プロファイル重要)FastJsonとjacksonの比較FastJsonのnullに対する処理(プロファイル重要)結果カプセル化オブジェクトを統一的に返す(コード重要)戻りコード定義統一結果列挙オブジェクト(コード重要)一、@RestController注記
プロジェクト開発では,インタフェースとインタフェースの間,前後端間のデータの転送にJson形式が用いられているが,Spring BootではインタフェースがJson形式のデータを返すのは簡単である.
Controllerで@RestController注記を使用してJson形式のデータを返します.@RestControllerSpring Bootに追加された注釈でもあります.この注釈には含まれています.
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    String value() default "";
}
@RestController注釈には、元の@Controller@ResponseBody注釈が含まれていることがわかります.Springを使用した友人は@Controller注釈についてよく知っています.ここでは説明しません.@ResponseBody注釈は、返されるデータ構造をJsonフォーマットに変換します.したがって、デフォルトでは、@RestController注釈を使用して返されるデータ構造をJson形式に変換し、Spring Bootでデフォルトで使用されるJson解析技術フレームワークはjacksonである.ポイントをつけましょうxmlのspring-boot-starter-web依存は、spring-boot-starter-json依存を見ることができます.

    org.springframework.boot
    spring-boot-starter-json
    2.0.3.RELEASE
    compile

Spring Bootの中で依存に対してすべてとても良いパッケージをして、多くのspring-boot-starter-xxxシリーズの依存を見ることができて、これはSpring Bootの特徴の1つで、人為的に多くの関連する依存を導入する必要はありませんて、starter-xxxシリーズは直接すべて必要な依存を含んで、だから私達は再び上のこのspring-boot-starter-json依存をクリックして、見ることができます:

    com.fasterxml.jackson.core
    jackson-databind
    2.9.6
    compile


    com.fasterxml.jackson.datatype
    jackson-datatype-jdk8
    2.9.6
    compile


    com.fasterxml.jackson.datatype
    jackson-datatype-jsr310
    2.9.6
    compile


    com.fasterxml.jackson.module
    jackson-module-parameter-names
    2.9.6
    compile

実際のプロジェクトでは、よく使われるデータ構造はクラスオブジェクト、Listオブジェクト、Mapオブジェクトにほかならないが、デフォルトのjacksonフレームワークがこの3つのよく使われるデータ構造をjsonに変換した後のフォーマットは
オブジェクト
{「id」:1,「username」:「倪升武」,「password」:「123456」}
しゅうごう
[{「id」:1,「username」:「倪升武」,「password」:「123456」},{「id」:2,「username」:「達人課」,「password」:「123456」}]
Map
{"作者情報":{"id":1,"username":"倪升武","password":"123456"},"CSDNアドレス":"http://blog.csdn.net/eson_15」、「ファン数」:4153、「ブログアドレス」:」http://blog.itcodai.com"}
二、jacksonにおけるnullの処理
実際のプロジェクトでは、null値が現れるのは避けられません.jsonを回転するときは、これらのnullが現れることを望んでいません.例えば、すべてのnullがjsonを回転するときに「」という空の文字列になることを望んでいません.どうすればいいですか.Spring Bootでは、構成をして新しい
jacksonの構成クラス:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

import java.io.IOException;

@Configuration
public class JacksonConfig {
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }
}

テストコード
@RequestMapping("/map")
public Map getMap() {
    Map map = new HashMap<>(3);
    User user = new User(1, "   ", null);
    map.put("    ", user);
    map.put("    ", "http://blog.itcodai.com");
    map.put("CSDN  ", null);
    map.put("    ", 4153);
    return map;
}

プロジェクトを再起動し、テストは(jacksonがすべてのnullフィールドを空の文字列に変換した)結果を返します.
{「作者情報」:{「id」:1,「username」:「倪昇武」,「password」:「},「CSDNアドレス」:「」,「ファン数」:4153,「ブログアドレス」:「http://blog.itcodai.com"}
三、アリババのFastJson
3.1 jacksonとfastJsonの対比
オプション
fastJson
jackson
使いやすさ
やさしい
中程度
高度な機能サポート
中程度
豊富
公式ドキュメント、Exampleサポート
中国語
英語
処理json速度
やや速い
速い
拡張的に見ると、fastJsonはjacksonほど柔軟ではありません.スピードや難易度から見ると、fastJsonは私たちのプロジェクトで現在アリのfastJsonを使っていることを考えることができます.便利です.
3.2 fastJson依存インポート

	com.alibaba
	fastjson
	1.2.35

3.3 fastJsonを使用してnullを処理する
 
fastJsonを使用する場合nullに対する処理はjacksonと若干異なり継承する必要があるWebMvcConfigurationSupportクラスを上書きconfigureMessageConvertersメソッドでは、null変換を実現するシーンを選択して構成すればよい.次のようになります.
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class fastJsonConfig extends WebMvcConfigurationSupport {

    /**
     *      FastJson   JSON MessageConverter
     * @param converters
     */
    @Override
    public void configureMessageConverters(List> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setSerializerFeatures(
                //   map    
                SerializerFeature.WriteMapNullValue,
                //  String   null  ""
                SerializerFeature.WriteNullStringAsEmpty,
                //  Number   null  0
                SerializerFeature.WriteNullNumberAsZero,
                //  List   null  []
                SerializerFeature.WriteNullListAsEmpty,
                //  Boolean   null  false
                SerializerFeature.WriteNullBooleanAsFalse,
                //       
                SerializerFeature.DisableCircularReferenceDetect);

        converter.setFastJsonConfig(config);
        converter.setDefaultCharset(Charset.forName("UTF-8"));
        List mediaTypeList = new ArrayList<>();
        //         ,    Controller  @RequestMapping      produces = "application/json"
        mediaTypeList.add(MediaType.APPLICATION_JSON);
        converter.setSupportedMediaTypes(mediaTypeList);
        converters.add(converter);
    }
}

四、統一リターンフォーマットパッケージ
4.1一括返却フォーマット
プロジェクトでは、応答をjsonにカプセル化して返します.一般的には、すべてのインタフェースのデータフォーマットを統一し、フロントエンド(iOS Android、Web)のデータ操作をより一貫させ、容易にします.一般的に、統合戻りデータフォーマットには固定されたフォーマットはなく、戻りデータの状態や戻りたい具体的なデータを明確に記述できればよい.ただし、通常はステータスコード、リターンメッセージ、データのいくつかの部分が含まれます.定義された統合は、次の結果を返します.
{「success」:ブール、//応答が成功したかどうか「code」:数字、//応答コード「message」:文字列、//戻りメッセージ「data」:HashMap//戻りデータ、キー値ペアに置く}
4.2統一リターン結果の定義
1)リターンコード定義列挙クラスの作成
package com.test.common.constants;
import lombok.Getter;

@Getter
public enum ResultCodeEnum {

	SUCCESS(true, 20000,"  "),
	UNKNOWN_REASON(false, 20001, "    "),
	BAD_SQL_GRAMMAR(false, 21001, "sql    "),
	JSON_PARSE_ERROR(false, 21002, "json    "),
	PARAM_ERROR(false, 21003, "     "),
	FILE_UPLOAD_ERROR(false, 21004, "      "),
	EXCEL_DATA_IMPORT_ERROR(false, 21005, "Excel      ");

	private Boolean success;

	private Integer code;

	private String message;

	private ResultCodeEnum(Boolean success, Integer code, String message) {
		this.success = success;
		this.code = code;
		this.message = message;
	}
}

2)一括返却オブジェクトクラスの作成
package com.test.common.vo;

@Data
@ApiModel(value = "        ")
public class Result {

	@ApiModelProperty(value = "    ")
	private Boolean success;

	@ApiModelProperty(value = "   ")
	private Integer code;

	@ApiModelProperty(value = "    ")
	private String message;

	@ApiModelProperty(value = "    ")
	private Map data = new HashMap();

	private Result(){}
     
	public static Result  ok(){
		Result  r = new Result ();
		r.setSuccess(ResultCodeEnum.SUCCESS.getSuccess());
		r.setCode(ResultCodeEnum.SUCCESS.getCode());
		r.setMessage(ResultCodeEnum.SUCCESS.getMessage());
		return r;
	}

	public static Result  error(){
		Result  r = new Result ();
		r.setSuccess(ResultCodeEnum.UNKNOWN_REASON.getSuccess());
		r.setCode(ResultCodeEnum.UNKNOWN_REASON.getCode());
		r.setMessage(ResultCodeEnum.UNKNOWN_REASON.getMessage());
		return r;
	}

	public static Result setResult(ResultCodeEnum resultCodeEnum){
		Result  r = new Result ();
		r.setSuccess(resultCodeEnum.getSuccess());
		r.setCode(resultCodeEnum.getCode());
		r.setMessage(resultCodeEnum.getMessage());
		return r;
	}

	public Result success(Boolean success){
		this.setSuccess(success);
		return this;
	}

	public Result message(String message){
		this.setMessage(message);
		return this;
	}

	public Result code(Integer code){
		this.setCode(code);
		return this;
	}

	public Result data(String key, Object value){
		this.data.put(key, value);
		return this;
	}

	public Result data(Map map){
		this.setData(map);
		return this;
	}
}