精华内容
下载资源
问答
  • 码云最有价值开源项目 后端接口和文档自动化,前端(客户端) 定制返回JSON的数据和结构! English 通用文档 视频教程 在线体验 导航目录: 项目简介 上手使用 社区生态 ...
  • 什么是JSON 到目前为止,已经执行了...因此,许多1是的WebAPI JSON(JavaScript对象符号)被很好地利用的格式。JSON的确切格式在RFC 8259中定义。基本上,将Python理解为数值和字符串,布尔值(真,假),可以包含n...

    什么是JSON

    到目前为止,已经执行了将html返回请求的过程。HTML通常被设计为在浏览器上显示并由人类操纵。因此,HTML可以与WebAPI一起使用,但是在程序中使用它通常很麻烦且效率低下。因此,许多1是的WebAPI JSON(JavaScript对象符号)被很好地利用的格式。JSON的确切格式在RFC 8259中定义。基本上,将Python理解为数值和字符串,布尔值(真,假),可以包含null的列表以及字典是很好的。写作风格几乎相同。以下是json的示例。

    {
    “ id”:3,
    “ name”:“ hoge”,
    “ ref”:[1、2、4],
    }
    

    在此示例中,将数组[1、2、3]分配给数值3,使用id作为键,使用字符串hoge,并使用“ ref”作为名称。

    http请求返回JSON

    要从Flask返回上述json,请执行以下操作。

    from flask import Flask, jsonify
    
    app = Flask(__name__)
    
    app.config['JSON_AS_ASCII'] = False
    
    books = [{'name': 'EffectivePython', 'price': 3315}, {'name': 'Expert Python Programming', 'price': 3960}]
    
    @app.route('/')
    def get_json():
        data = {
            "id": 3,
            "name": "hoge",
            "ref": [1, 2, 4],
        }
        return jsonify(data)
    if __name__ == '__main__':
        app.run()
    

    综上,可以使用普通的Python字典和列表来表示JSON,然后使用jsonify函数将其转换为JSON。

    如何从PyCharm调试WebAPI

    到目前为止,我从浏览器检查了网页并进行了调试。但是,在调试WebAPI时,可以从PyCharm进行调试更加方便。到目前为止,尤其是对于POST,已经使用了表单,但是WebAPI很难通过浏览器进行操作,因为POST是直接执行的。PyCharm(专业版)具有一个功能(HTTP客户端),可在PyCharm上创建并发送HTTP请求。功能介绍。除PyCharm之外的其他IDE可能会这样做。另一种选择是使用称为cURL的工具。如果您使用的不是PyCharm,请检查一下。

    PyCharm的HTTP客户端提供两种方法:一种用于发送临时HTTP请求,另一种用于将HTTP请求保存到文件并发送。在本文中,我将向您展示如何将可重用的HTTP请求保存到文件中。

    首先,从文件菜单中选择“新建”,然后单击“ HTTP请求”(见下文)。
    在这里插入图片描述
    然后将要求您输入文件名,因此输入适当的名称(或使用get_test)。

    在这里插入图片描述
    由于这次发送了GET请求,因此请从右上方的“ Add Request”中选择“ GET Request”(请参见下图)。
    在这里插入图片描述
    使用PyCharm的HTTPClient独有的符号编写多个HTTP请求时,显示请求分隔符。您可以写很多,但这是最低要求。其他功能基本上遵循HTTP标头的语法。我要你调查。

    接下来,让我们实际发送此请求。首先,执行示例程序。之后,您可以通过返回到HTTPClient并在编辑器中单击GET左侧的绿色▶(下方)来发送请求。
    在这里插入图片描述

    在POST请求中接收JSON

    至此,前面已经完成了响应GET请求发送回JSON的过程。接下来,我将介绍接收POST请求和其中包含的json的过程。

    主程序(app.py)如下。

    from flask import Flask, request, jsonify
    
    app = Flask(__name__)
    
    # 日本語を使えるように
    app.config['JSON_AS_ASCII'] = False
    
    books = [{'name': 'EffectivePython', 'price': 3315}, {'name': 'Expert Python Programming', 'price': 3960}]
    
    
    @app.route('/books', methods=['POST'])
    def post_json():
        # JSONを受け取る
        json = request.get_json()
    
        # JSONをパースする
        name = json['name']
        price = json['price']
        book = {'name': name, 'price': price}
        book_id = len(books)
        books.append(book)
    
        # 返却用ディクショナリを構築
        book['id'] = book_id
        return jsonify(book)  # JSONをレスポンス
    
    
    @app.route('/books/<book_id>', methods=['GET'])
    def get_json_from_dictionary(book_id):
        return jsonify(books[int(book_id)])
    
    
    if __name__ == '__main__':
        app.run()
    
    

    一个示例请求如下。

    POST http://localhost:5000/books
    Content-Type: application/json
    
    {
      "name": "hoge",
      "price": 1000
    }
    
    ###
    
    GET http://localhost:5000/books/2
    Content-Type: application/json
    
    ###
    

    收到POST请求后,您可以使用get_json将JSON转换为Python对象,如下所示。

    request.get_json()
    

    由get_json转换的对象可以像Python字典和列表一样进行处理(请参见下文)。

       name = json['name']
       price = json['price']
    

    此外,您可以使用迄今尚未解释的相同名称定义URL,但使用不同的HTTP方法(此处为GET和POST)。WebAPI(尤其是那些称为REST API的API)通常会这样做。这具有在GET的情况下显式获取并在POST的情况下进行传输的含义。

    展开全文
  • SpringBoot系列教程22--整合SpringMVC之HttpMessageConverters作者:一一哥一.HttpMessageConverter...但是前端传入的 json 数据如何被解析成 Java 对象作为 API入参,后端返回结果又如何将 Java 对象解析成 json 格...

    SpringBoot系列教程22--整合SpringMVC之HttpMessageConverters

    作者:一一哥

    一.HttpMessageConverter简介

    1.概述

    现在我们进行web开发,一般都要设计成RESTful风格的API,通过json格式的数据进行交互。但是前端传入的 json 数据如何被解析成 Java 对象作为 API入参,后端返回结果又如何将 Java 对象解析成 json 格式数据返回给前端,在整个数据流转过程中,这是由谁来完成的呢?

    其实这都是由HttpMessageConverter起到的作用!

    2.HttpMessageConverter简介

    org.springframework.http.converter.HttpMessageConverter 是SpringMVC中提供的一个策略接口,它是一个转换器类,负责转换HTTP请求和响应,可以把对象自动转换为JSON(使用Jackson库或Gson库)或XML(使用Jackson XML或者JAXB2),对字符串默认使用UTF-8编码处理,一般情况下采用默认配置就可以。

    该接口说明如下:

    Strategy interface that specifies a converter that can convert from and to HTTP requests and responses.
    简单说就是 HTTP request (请求)和response (响应)的转换器。该接口里有5个方法,接收到请求时判断是否能读(canRead),能读则读(read);返回结果时判断是否能写(canWrite),能写则写(write),以及获取支持的 MediaType(application/json之类)方法。

    boolean canRead(Class<?> clazz, MediaType mediaType);
    boolean canWrite(Class<?> clazz, MediaType mediaType);
    List<MediaType> getSupportedMediaTypes();
    T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException;
    void write(T t, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException;

    3.HttpMessageConverter转换原理

    利用SpringMVC框架,可以使得我们在开发时,只要在代码中使用@RequestBody和@ResponseBody两个注解,就可以分别完成从请求报文到对象和从对象到响应报文的转换。而在源码内部,其实这种灵活的消息转换机制就是利用HttpMessageConverter来实现的。

    实现过程参考下图:

    ea614f6ead5dcf7bc298e5c39a180bfb.png

    SpringMVC在启动时会自动配置一些默认的HttpMessageConverter转换器,在 WebMvcConfigurationSupport 类中添加了缺省的MessageConverter,比如MappingJackson2HttpMessageConverter,StringHttpMessageConverter等。

    protected final void addDefaultHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
            StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
            stringConverter.setWriteAcceptCharset(false);
    
            messageConverters.add(new ByteArrayHttpMessageConverter());
            messageConverters.add(stringConverter);
            messageConverters.add(new ResourceHttpMessageConverter());
            messageConverters.add(new SourceHttpMessageConverter<Source>());
            messageConverters.add(new AllEncompassingFormHttpMessageConverter());
    
            if (romePresent) {
                messageConverters.add(new AtomFeedHttpMessageConverter());
                messageConverters.add(new RssChannelHttpMessageConverter());
            }
    
            if (jackson2XmlPresent) {
                ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.xml().applicationContext(this.applicationContext).build();
                messageConverters.add(new MappingJackson2XmlHttpMessageConverter(objectMapper));
            }
            else if (jaxb2Present) {
                messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
            }
    
            if (jackson2Present) {
                ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().applicationContext(this.applicationContext).build();
                messageConverters.add(new MappingJackson2HttpMessageConverter(objectMapper));
            }
            else if (gsonPresent) {
                messageConverters.add(new GsonHttpMessageConverter());
            }
        }

    从源码中可以看到,SpringMVC中使用Jackson库或Gson库来转换json字符串,使用使用Jackson XML或者JAXB2来转换xml。

    而如果我们没有配置自己的 MessageConverter,SpringMVC 启动时就会调用 addDefaultHttpMessageConverters方法。

    6a308875c5472aa08c22b55325a89826.png

    4.Spring Boot中自定义HttpMessageConverters实现思路

    在Spring Boot中我们可以使用HttpMessageConverters添加HttpMessageConverter原生转换类或自定义转换类。

    import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
    import org.springframework.context.annotation.*;
    import org.springframework.http.converter.*;
    
    @Configuration
    public class MyConfiguration {
    
        @Bean
        public HttpMessageConverters customConverters() {
            HttpMessageConverter<?> additional = ...
            HttpMessageConverter<?> another = ...
            return new HttpMessageConverters(additional, another);
        }
    }

    从上面的代码示例中,我们看到可以把HttpMessageConverter添加到converters列表,通过这种方式覆盖默认的转换器列表(converters)。

    5.自定义消息转换器的方式

    我们可以自定义自己的消息转换器来满足特定的需求,一般自定义消息转换器有两种方式:

    • 1、使用spring或者第三方提供的现成的HttpMessageConverter;
    • 2、自己重写一个HttpMessageConverter。

    二.Spring Boot中用FastJsonHttpMessageConverter替换默认转换器

    1.创建SpringBoot项目

    我们在之前的基础上,新建一个demo10,并将其改造成SpringBoot项目。

    e3583b20c3702807b5a4f2dd902d83dd.png

    2.添加FastJson依赖

    在SpringBoot项目中,当我们在控制器类或者其内部的方法上添加@RestController注解和@ResponseBody注解后,默认会使用jackson插件来返回json格式的数据,但是我们也可以利用fastjson为我们提供的FastJsonHttpMessageConverter来返回json格式的数据。

    首先引入fastjson的依赖。

    <dependency>
       <groupId>com.alibaba</groupId>
       <artifactId>fastjson</artifactId>
       <version>1.2.61</version>
    </dependency>

    3.配置FastJsonHttpMessageConverter

    我们可以通过实现WebMvcConfigurer接口,来配置FastJsonHttpMessageConverter,在Spring Boot2.0版本以后推荐使用这种方式来进行web配置,这样不会覆盖掉Spring Boot的一些默认配置.

    我们创建如下的目录结构。

    4287c7fc39aaa8bb68d1b3c5b919984a.png
    /**
     *实现WebMvcConfigurer接口来配置FastJsonHttpMessageConverter,
     *Spring Boot2.0版本以后推荐使用这种方式来进行web配置,这样不会覆盖掉Spring Boot的一些默认配置.
     */
    @Configuration
    public class CustomWebMvcConfigurer implements WebMvcConfigurer {
    
        @Override
        public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
            FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
            FastJsonConfig config = new FastJsonConfig();
            config.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);
            converter.setFastJsonConfig(config);
            converter.setDefaultCharset(Charset.forName("UTF-8"));
            converters.add(converter);
        }
    
    }

    3.1 fastJson中的SerializerFeature

    在fastJson配置实体时,会调用setSerializerFeatures方法,可以配置多个过滤方式,常用的如下:

    509a7561019a465fda28be0df940a3e4.png

    常用的SerializerFeature释义

    QuoteFieldNames,//输出key时是否使用双引号,默认为true;
    
    UseSingleQuotes,//使用单引号而不是双引号,默认为false;
    
    WriteMapNullValue,//是否输出值为null的字段,默认为false; 
    
    WriteEnumUsingToString,//Enum输出name()或者original,默认为false;
    
    UseISO8601DateFormat,//Date使用ISO8601格式输出,默认为false;
    
    WriteNullListAsEmpty,//List字段如果为null,输出为[],而非null;
    
    WriteNullStringAsEmpty,//字符类型字段如果为null,输出为"",而非null; 
         
    WriteNullNumberAsZero,//数值字段如果为null,输出为0,而非null;
    
    WriteNullBooleanAsFalse,//Boolean字段如果为null,输出为false,而非null;
    
    SkipTransientField,//如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true;
    
    SortField,//按字段名称排序后输出,默认为false;
    
    @Deprecated
    WriteTabAsSpecial,//把t做转义输出,默认为false;
    
    PrettyFormat,//结果是否格式化,默认为false;
    
    WriteClassName,//序列化时写入类型信息,默认为false,反序列化是需用到;
    
    DisableCircularReferenceDetect,//消除对同一对象循环引用的问题,默认为false;
    
    WriteSlashAsSpecial,//对斜杠'/'进行转义;
    
    BrowserCompatible,//将中文都会序列化为uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false;
    
    WriteDateUseDateFormat,//全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";JSON.toJSONString(obj,SerializerFeature.WriteDateUseDateFormat);
    
    DisableCheckSpecialChar,//一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性,默认为false.

    4.创建对象实体

    我们创建一个“com.yyg.boot.domain”包,在这里创建一个User实体类。

    package com.yyg.boot.domain;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    
    @Data
    @AllArgsConstructor
    public class User {
    
        private String name;
    
        private String address;
    
    }

    5.创建Controller

    我们创建“com.yyg.boot.web”包,在里面创建一个Controller类。

    package com.yyg.boot.web;
    
    import com.yyg.boot.domain.User;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.ArrayList;
    import java.util.List;
    
    @RestController
    public class UserController {
    
        @RequestMapping(value = "/get", method = RequestMethod.GET)
        public Object getList() {
            List<User> list = new ArrayList<>();
            //测试字符串有null的情况
            User u1 = new User("一一哥", null);
            list.add(u1);
            return list;
        }
    
    }

    6.创建程序入口类

    在项目根目录下创建启动类。

    package com.yyg.boot;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * 自定义HttpMessageConverter
     */
    @SpringBootApplication
    public class ConvertApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ConvertApplication.class, args);
        }
    
    }

    整个项目结构:

    0965dbe3904e897ba17d8e0d37d254da.png

    7.启动类进行测试

    启动项目访问http://localhost:8080/users

    因为我们CustomWebMvcConfigurer类的代码中没有配置WriteMapNullValue,所以如果返回结果中有null值则不显示,结果如下:

    71ce30835c0746a26b074ac0be0a2115.png

    接着我们可以在CustomWebMvcConfigurer中添加WriteMapNullValue,如下图:

    ac7b4bdc2d126ed4b1e82064e3760823.png

    然后重新启动项目并访问,从结果可以看出我们配置的消息转换器起作用。

    594591eaafb4c9335ac8be5b0ad680b4.png

    接着我们可以在CustomWebMvcConfigurer中添加WriteNullStringAsEmpty,如下图:

    dd1c84e5b5d35a792403e9a5e500817a.png

    然后重新启动项目并访问,从结果可以看出我们配置的消息转换器又起了作用。

    2ef99f56557a4cf84b1484f90a373814.png

    展开全文
  • SpringBoot系列教程22--整合SpringMVC之HttpMessageConverters作者:一一哥一.HttpMessageConverter...但是前端传入的 json 数据如何被解析成 Java 对象作为 API入参,后端返回结果又如何将 Java 对象解析成 json 格...

    SpringBoot系列教程22--整合SpringMVC之HttpMessageConverters

    作者:一一哥

    一.HttpMessageConverter简介

    1.概述

    现在我们进行web开发,一般都要设计成RESTful风格的API,通过json格式的数据进行交互。但是前端传入的 json 数据如何被解析成 Java 对象作为 API入参,后端返回结果又如何将 Java 对象解析成 json 格式数据返回给前端,在整个数据流转过程中,这是由谁来完成的呢?

    其实这都是由HttpMessageConverter起到的作用!

    2.HttpMessageConverter简介

    org.springframework.http.converter.HttpMessageConverter 是SpringMVC中提供的一个策略接口,它是一个转换器类,负责转换HTTP请求和响应,可以把对象自动转换为JSON(使用Jackson库或Gson库)或XML(使用Jackson XML或者JAXB2),对字符串默认使用UTF-8编码处理,一般情况下采用默认配置就可以。

    该接口说明如下:

    Strategy interface that specifies a converter that can convert from and to HTTP requests and responses.
    简单说就是 HTTP request (请求)和response (响应)的转换器。该接口里有5个方法,接收到请求时判断是否能读(canRead),能读则读(read);返回结果时判断是否能写(canWrite),能写则写(write),以及获取支持的 MediaType(application/json之类)方法。

    boolean canRead(Class<?> clazz, MediaType mediaType);
    boolean canWrite(Class<?> clazz, MediaType mediaType);
    List<MediaType> getSupportedMediaTypes();
    T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException;
    void write(T t, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException;

    3.HttpMessageConverter转换原理

    利用SpringMVC框架,可以使得我们在开发时,只要在代码中使用@RequestBody和@ResponseBody两个注解,就可以分别完成从请求报文到对象和从对象到响应报文的转换。而在源码内部,其实这种灵活的消息转换机制就是利用HttpMessageConverter来实现的。

    实现过程参考下图:

    3066e1c1a73a342c2fcb388a33d285cb.png

    SpringMVC在启动时会自动配置一些默认的HttpMessageConverter转换器,在 WebMvcConfigurationSupport 类中添加了缺省的MessageConverter,比如MappingJackson2HttpMessageConverter,StringHttpMessageConverter等。

    protected final void addDefaultHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
            StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
            stringConverter.setWriteAcceptCharset(false);
    
            messageConverters.add(new ByteArrayHttpMessageConverter());
            messageConverters.add(stringConverter);
            messageConverters.add(new ResourceHttpMessageConverter());
            messageConverters.add(new SourceHttpMessageConverter<Source>());
            messageConverters.add(new AllEncompassingFormHttpMessageConverter());
    
            if (romePresent) {
                messageConverters.add(new AtomFeedHttpMessageConverter());
                messageConverters.add(new RssChannelHttpMessageConverter());
            }
    
            if (jackson2XmlPresent) {
                ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.xml().applicationContext(this.applicationContext).build();
                messageConverters.add(new MappingJackson2XmlHttpMessageConverter(objectMapper));
            }
            else if (jaxb2Present) {
                messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
            }
    
            if (jackson2Present) {
                ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().applicationContext(this.applicationContext).build();
                messageConverters.add(new MappingJackson2HttpMessageConverter(objectMapper));
            }
            else if (gsonPresent) {
                messageConverters.add(new GsonHttpMessageConverter());
            }
        }

    从源码中可以看到,SpringMVC中使用Jackson库或Gson库来转换json字符串,使用使用Jackson XML或者JAXB2来转换xml。

    而如果我们没有配置自己的 MessageConverter,SpringMVC 启动时就会调用 addDefaultHttpMessageConverters方法。

    a1a323fd1a13803857c0c79ddcffa8a5.png

    4.Spring Boot中自定义HttpMessageConverters实现思路

    在Spring Boot中我们可以使用HttpMessageConverters添加HttpMessageConverter原生转换类或自定义转换类。

    import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
    import org.springframework.context.annotation.*;
    import org.springframework.http.converter.*;
    
    @Configuration
    public class MyConfiguration {
    
        @Bean
        public HttpMessageConverters customConverters() {
            HttpMessageConverter<?> additional = ...
            HttpMessageConverter<?> another = ...
            return new HttpMessageConverters(additional, another);
        }
    }

    从上面的代码示例中,我们看到可以把HttpMessageConverter添加到converters列表,通过这种方式覆盖默认的转换器列表(converters)。

    5.自定义消息转换器的方式

    我们可以自定义自己的消息转换器来满足特定的需求,一般自定义消息转换器有两种方式:

    • 1、使用spring或者第三方提供的现成的HttpMessageConverter;
    • 2、自己重写一个HttpMessageConverter。

    二.Spring Boot中用FastJsonHttpMessageConverter替换默认转换器

    1.创建SpringBoot项目

    我们在之前的基础上,新建一个demo10,并将其改造成SpringBoot项目。

    3fbc967cb31dce8fd0ad929c45dbc6e5.png

    2.添加FastJson依赖

    在SpringBoot项目中,当我们在控制器类或者其内部的方法上添加@RestController注解和@ResponseBody注解后,默认会使用jackson插件来返回json格式的数据,但是我们也可以利用fastjson为我们提供的FastJsonHttpMessageConverter来返回json格式的数据。

    首先引入fastjson的依赖。

    <dependency>
       <groupId>com.alibaba</groupId>
       <artifactId>fastjson</artifactId>
       <version>1.2.61</version>
    </dependency>

    3.配置FastJsonHttpMessageConverter

    我们可以通过实现WebMvcConfigurer接口,来配置FastJsonHttpMessageConverter,在Spring Boot2.0版本以后推荐使用这种方式来进行web配置,这样不会覆盖掉Spring Boot的一些默认配置.

    我们创建如下的目录结构。

    2ca07afcfea8e5b073f1ae13a398a582.png
    /**
     *实现WebMvcConfigurer接口来配置FastJsonHttpMessageConverter,
     *Spring Boot2.0版本以后推荐使用这种方式来进行web配置,这样不会覆盖掉Spring Boot的一些默认配置.
     */
    @Configuration
    public class CustomWebMvcConfigurer implements WebMvcConfigurer {
    
        @Override
        public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
            FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
            FastJsonConfig config = new FastJsonConfig();
            config.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect);
            converter.setFastJsonConfig(config);
            converter.setDefaultCharset(Charset.forName("UTF-8"));
            converters.add(converter);
        }
    
    }

    3.1 fastJson中的SerializerFeature

    在fastJson配置实体时,会调用setSerializerFeatures方法,可以配置多个过滤方式,常用的如下:

    c6c23ae0f88bf3f600ffb9077616dc59.png

    常用的SerializerFeature释义

    QuoteFieldNames,//输出key时是否使用双引号,默认为true;
    
    UseSingleQuotes,//使用单引号而不是双引号,默认为false;
    
    WriteMapNullValue,//是否输出值为null的字段,默认为false; 
    
    WriteEnumUsingToString,//Enum输出name()或者original,默认为false;
    
    UseISO8601DateFormat,//Date使用ISO8601格式输出,默认为false;
    
    WriteNullListAsEmpty,//List字段如果为null,输出为[],而非null;
    
    WriteNullStringAsEmpty,//字符类型字段如果为null,输出为"",而非null; 
         
    WriteNullNumberAsZero,//数值字段如果为null,输出为0,而非null;
    
    WriteNullBooleanAsFalse,//Boolean字段如果为null,输出为false,而非null;
    
    SkipTransientField,//如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true;
    
    SortField,//按字段名称排序后输出,默认为false;
    
    @Deprecated
    WriteTabAsSpecial,//把t做转义输出,默认为false;
    
    PrettyFormat,//结果是否格式化,默认为false;
    
    WriteClassName,//序列化时写入类型信息,默认为false,反序列化是需用到;
    
    DisableCircularReferenceDetect,//消除对同一对象循环引用的问题,默认为false;
    
    WriteSlashAsSpecial,//对斜杠'/'进行转义;
    
    BrowserCompatible,//将中文都会序列化为uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false;
    
    WriteDateUseDateFormat,//全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";JSON.toJSONString(obj,SerializerFeature.WriteDateUseDateFormat);
    
    DisableCheckSpecialChar,//一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性,默认为false.

    4.创建对象实体

    我们创建一个“com.yyg.boot.domain”包,在这里创建一个User实体类。

    package com.yyg.boot.domain;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    
    @Data
    @AllArgsConstructor
    public class User {
    
        private String name;
    
        private String address;
    
    }

    5.创建Controller

    我们创建“com.yyg.boot.web”包,在里面创建一个Controller类。

    package com.yyg.boot.web;
    
    import com.yyg.boot.domain.User;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.ArrayList;
    import java.util.List;
    
    @RestController
    public class UserController {
    
        @RequestMapping(value = "/get", method = RequestMethod.GET)
        public Object getList() {
            List<User> list = new ArrayList<>();
            //测试字符串有null的情况
            User u1 = new User("一一哥", null);
            list.add(u1);
            return list;
        }
    
    }

    6.创建程序入口类

    在项目根目录下创建启动类。

    package com.yyg.boot;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * 自定义HttpMessageConverter
     */
    @SpringBootApplication
    public class ConvertApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ConvertApplication.class, args);
        }
    
    }

    整个项目结构:

    94018cdec0e7728683d18beeddc10bb4.png

    7.启动类进行测试

    启动项目访问http://localhost:8080/users

    因为我们CustomWebMvcConfigurer类的代码中没有配置WriteMapNullValue,所以如果返回结果中有null值则不显示,结果如下:

    6c0d087e75ec7200dd15166f2b43751e.png

    接着我们可以在CustomWebMvcConfigurer中添加WriteMapNullValue,如下图:

    5e751b4a1ba456b4552eec656351f5f3.png

    然后重新启动项目并访问,从结果可以看出我们配置的消息转换器起作用。

    9958bd1a715d663273f551192fca5f44.png

    接着我们可以在CustomWebMvcConfigurer中添加WriteNullStringAsEmpty,如下图:

    4210d5cbd0fca02ad864b5f2186cb162.png

    然后重新启动项目并访问,从结果可以看出我们配置的消息转换器又起了作用。

    8a44d444d795a3fcc965d95182ace0c5.png

    展开全文
  • 我目前正在使用Spring MVC和Hibernate开发我的Web应用程序.仍在学习Java的内部工作原理.我发现自己处于一种需要将数据...这样,我的返回JSON可以在整个api中保持一致.这就是我创建ReturnObject的方式public class R...

    我目前正在使用Spring MVC和Hibernate开发我的Web应用程序.仍在学习Java的内部工作原理.

    我发现自己处于一种需要将数据存储在可以接受不同类型的对象以及一些其他数据字符串的字段中的情况.更准确地说,我想创建一个可以容纳消息,错误代码等的ReturnObject.这样,我的返回JSON可以在整个api中保持一致.

    这就是我创建ReturnObject的方式

    public class ReturnResponse {

    //Set fields

    private Object returnObj;

    private HttpStatus httpStatus;

    private String message;

    private String developerMessage;

    // Start build

    public ReturnResponse(){

    this.returnObj = returnObj;

    this.httpStatus =.....etc.

    }

    // Setters... getters...

    }

    私有对象returnObj;这样该字段可以接受Collection,Maps,Class..etc,但是这样安全吗?

    我似乎记得,在字段中声明特定对象类型以确保类型安全始终是一个好习惯.

    问题

    >您将来会看到可预见的问题吗,有没有更好的方法?

    >如果这不是安全类型,我将如何使其更安全.

    展开全文
  • 今天在做ajax调用webapi接口的时候,用的是fidder调试的。能看到返回的数据是xml,类似于json格式,用alert(data),始终都是object类型的。但是在读取值的时候,始终不知道该如何取值,试了N种方式取值还是取不到。...
  • //获取后台返回Json对象 JSONObject mJsonObject = JSONUtil.getJSON(BASE_URL); No1.setText("获取成功!"); //测试 JSONArray mJsonArray = mJsonObject.getJSONArray("student"); JSONObject ...
  • 那么前端传入的 json 数据如何被解析成 Java 对象作为 API入参,API 返回结果又如何将 Java 对象解析成 json 格式数据返回给前端?其实在整个数据流转过程中,HttpMessageConverter起到了重要作用;本文我们除了关注...
  • 有时我们 nginx 需要和 wowza 服务器交互以进行一些 LB 事宜;...本文以一个简单的 http 发送参数到 wowza,然后 wowza 返回一个 json 为例(经典的 REST 案例),介绍如何让你的 wowza 服务器提供 RESTful web
  • 现今很多Web应用开发都是分前后台的,后台开发提供接口调用返回Json对象,前台使用JS框架去加载后台返回的Json.本文以实例简述如何通过HttpClient测试这样的后台接口   处理Json对象的基本API JSON包中最常用的两...
  • 那么前端传入的 json 数据如何被解析成 Java 对象作为 API入参,API 返回结果又如何将 Java 对象解析成 json 格式数据返回给前端? 其实在整个数据流转过程中,HttpMessageConverter起到了重要作...
  • 那么前端传入的 json 数据如何被解析成 Java 对象作为 API入参,API 返回结果又如何将 Java 对象解析成 json 格式数据返回给前端,其实在整个数据流转过程中,HttpMessageConverter 起到了重要作用;另外在转换的...
  • 但是前端传入的 json 数据如何被解析成 Java 对象作为 API入参,后端返回结果又如何将 Java 对象解析成 json 格式数据返回给前端,在整个数据流转过程中,这是由谁来完成的呢?其实这都是由HttpMessageConverter起.....
  • 但是前端传入的 json 数据如何被解析成 Java 对象作为 API入参,后端返回结果又如何将 Java 对象解析成 json 格式数据返回给前端,在整个数据流转过程中,这是由谁来完成的呢? 其实这都是由HttpMessageConv...
  • 操作成功则返回200状态和上面的JSON的数据,不同的操作状态有不同的响应数据(为了简单起见只列出了两种,200和404)。 <p>API制定完以后,Alex和Bob就开始编码了。Alex把评论都外观...
  • SpringBoot系列教程22--整合SpringMVC之HttpMessageConverters 作者:一一哥 一.HttpMessageConverter简介 ...但是前端传入的 json 数据如何被解析成 Java 对象作为 API入参,后端返回结果又如何将 Java 对象解析...
  • 2020-08-26

    2020-08-26 15:34:58
    但是前端传入的 json 数据如何被解析成 Java 对象作为 API入参,后端返回结果又如何将 Java 对象解析成 json 格式数据返回给前端,在整个数据流转过程中,这是由谁来完成的呢? 其实这都是由HttpMessageConverter起...
  • 但是前端传入的 json 数据如何被解析成 Java 对象作为 API入参,后端返回结果又如何将 Java 对象解析成 json 格式数据返回给前端,在整个数据流转过程中,这是由谁来完成的呢? 其实这都是由HttpMessageConverter起...
  • 但是前端传入的 json 数据如何被解析成 Java 对象作为 API入参,后端返回结果又如何将 Java 对象解析成 json 格式数据返回给前端,在整个数据流转过程中,这是由谁来完成的呢? 其实这都是由HttpMessageConverter起...
  • 那么前端传入的 json 数据如何序列化成 Java 对象,后端返回的结果又如何将 Java 对象解析成 json 格式数据返回给前端,在整个解析过程,HttpMessageConverter 起到了重要作用,各大公司实现了自己...
  • Json Web Token 简称为 JWT,它定义了一种用于简洁、自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名。 说得好像跟真的一样,那么到底要...
  • 需要基于浏览器为我们提供的 <a href="https://developer.mozilla.org/en-US/docs/Web/API/Selection_API">Selection API</a> 。它的;selection">兼容性还不错。如果要支持更低版本的浏览器则需要用 polyfill。 <p>...
  • 3.疑难问题1)API返回的Dynamic对象应该如何使用?答:如果您调用API,return的是 a.由DynamicJson.Parse转换而来,您可以用.[属性名称] 访问到该属性的值; 譬如 BasicAPI.cs中GetAccessToken: var token =...
  • 处理将返回JSON反序列化为Kotlin数据对象 以通过URL加载和缓存图像。 它利用了Jetpack库中的以下组件: 使用绑定适配器进行 使用SafeArgs插件,以在片段之间传递参数 屏幕截图 上课时如何使用此仓库 此类中的每个...
  • ├── zheng-oss -- 对象存储系统 | ├── zheng-oss-sdk -- 开发工具包 | ├── zheng-oss-web -- 前台接口[端口:7771] | └── zheng-oss-admin -- 后台管理[端口:7772] ├── zheng-message -- 实时通知系统...
  • 此外,《ASP.NET 4高级程序设计(第4版)》专门提供了两章的内容来教你如何用Ajax 技术制作快速响应的页面,以及如何使用微软的ASP.NETAJAX平台。另外,还专门介绍了ASP.NET4 新增的功能,如MVC 和动态数据等。  ...
  • 此外,本书专门提供了两章的内容来教你如何用ajax 技术制作快速响应的页面,以及如何使用微软的asp.net ajax 平台。另外,还专门介绍了asp.net 4 新增的功能,如mvc 和动态数据等。  《asp.net 4高级程序设计:第4...

空空如也

空空如也

1 2 3
收藏数 60
精华内容 24
关键字:

webapi如何返回json对象