【SpringMVC】JSON数据返回及异常处理

简介: Jackson是一个用于Java对象和JSON数据之间相互转换的开源库。它提供了一组强大的API,可以将Java对象序列化为JSON格式的字符串,也可以将JSON字符串反序列化为Java对象。Jackson库由三个核心模块组成::用于将Java对象与JSON数据进行绑定(序列化和反序列化)。它提供了一系列注解,如等,用于指定对象属性与JSON字段之间的映射关系,以及日期、时间等特殊类型的处理方式。Databind模块也提供了一些高级特性,如多态类型处理、双向引用处理等。

一、JSON数据返回

1、导入依赖

SpringMVC里的pom.xml文件里面添加jackson的依赖

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.9.3</version>
</dependency>

image.gif

2、配置文件

在自己配置的Spring-mvc.xml文件里面添加配置

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="mappingJackson2HttpMessageConverter"/>
            </list>
        </property>
    </bean>
    <bean id="mappingJackson2HttpMessageConverter"
          class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <!--处理中文乱码以及避免IE执行AJAX时,返回JSON出现下载文件-->
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
                <value>text/json;charset=UTF-8</value>
                <value>application/json;charset=UTF-8</value>
            </list>
        </property>
    </bean>

image.gif

3、Jackson

3.1、介绍

Jackson是一个用于Java对象和JSON数据之间相互转换的开源库。它提供了一组强大的API,可以将Java对象序列化为JSON格式的字符串,也可以将JSON字符串反序列化为Java对象

Jackson库由三个核心模块组成:

    1. Jackson Databind:用于将Java对象与JSON数据进行绑定(序列化和反序列化)。它提供了一系列注解,如@JsonProperty@JsonFormat等,用于指定对象属性与JSON字段之间的映射关系,以及日期、时间等特殊类型的处理方式。Databind模块也提供了一些高级特性,如多态类型处理、双向引用处理等。
    2. Jackson Core:提供了JSON处理的核心功能,如JsonParser(用于解析JSON字符串)、JsonGenerator(用于生成JSON字符串)等。Core模块还提供了一些基本的数据类型和集合类型的序列化和反序列化支持。
    3. Jackson Annotation:提供了一些注解,用于在Java类中指定JSON字段的名称、顺序、默认值等属性。这些注解在Databind模块中使用。

    Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。Jackson所依赖的jar包较少,简单易用并且性能也要相对高些,并且Jackson社区相对比较活跃,更新速度也比较快。

    3.2、特点

      • 容易使用,提供了高层次外观,简化常用的用例。
      • 无需创建映射,API提供了默认的映射大部分对象序列化。
      • 性能高,快速,低内存占用
      • 创建干净的json
      • 不依赖其他库
      • 代码开源

      3.3、常用注解

      Jackson库提供了一些常用的注解,用于在Java类中指定与JSON字段相关的属性和行为。

      常用注解

      注解 说明
      @JsonIgnore
       
      作用在字段或方法上,用来完全忽略被注解的字段和方法对应的属性
       
      @JsonProperty
       
      作用在字段或方法上,用来对属性的序列化/反序列化,可以用来避免遗漏属性,同时提供对属性名称重命名
       
      @JsonIgnoreProperties
       
      作用在类上,用来说明有些属性在序列化/反序列化时需要忽略掉
       
      @JsonUnwrapped
       
      作用在属性字段或方法上,用来将子JSON对象的属性添加到封闭的JSON对象
       
      @JsonFormat
       
      用于指定日期、时间等特殊类型的格式化方式。可以通过该注解的pattern属性指定日期格式。例如:


      @JsonFormat(pattern="yyyy-MM-dd") private Date birthDate;
        1. @JsonInclude:用于控制序列化时是否包含某个属性。可以通过该注解的value属性指定包含属性的条件。例如:
        @JsonInclude(JsonInclude.Include.NON_NULL) private String address;
        1. image.gif
        2. @JsonAlias:用于指定多个JSON字段与同一个Java属性的映射关系。可以通过该注解的value属性指定多个JSON字段的名称。例如:
        @JsonAlias({"firstName", "first_name"}) private String name;
        1. image.gif
        2. @JsonGetter和@JsonSetter:用于指定自定义的getter和setter方法与JSON字段之间的映射关系。例如:
        @JsonGetter("name") public String getUserName() { return userName; }
        1. image.gif
        2. @JsonAnyGetter和@JsonAnySetter:用于处理不确定的属性(即不在Java类中定义的属性)。可以通过这些注解来动态地将这些属性转换为Map或其他形式。例如:
        @JsonAnyGetter public Map<String, Object> getAdditionalProperties() { return additionalProperties; }
        1. image.gif

        4、@ResponseBody注解使用

        @ResponseBody注解是Spring框架中常用的注解之一,它通常用于控制器方法或Restful API方法上,用于指示方法返回的结果直接写入HTTP响应体中,而不是通过视图解析器进行解析。它可以将方法返回的对象转换为指定的格式,如JSON、XML或其他格式,并将其作为HTTP响应体返回给客户端。

        作用:将Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。

        注意:在使用此注解之后不会再走视图解析器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

        @ResponseBody注解的方法,可以返回任何类型的对象作为响应体,包括普通对象、集合、字符串等。Spring会自动根据请求头中的"Accept"字段,选择合适的HttpMessageConverter进行转换。例如,如果请求头中指定了"Accept:http://localhost:8080/json",则返回的对象会被转换为JSON格式的字符串。

        4.1、Controller层

        package com.tgq.web;
        import com.tgq.biz.MyStudentBiz;
        import com.tgq.model.MyStudent;
        import com.tgq.utils.PageBean;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.stereotype.Controller;
        import org.springframework.web.bind.annotation.RequestMapping;
        import org.springframework.web.bind.annotation.ResponseBody;
        import javax.servlet.http.HttpServletRequest;
        import java.util.HashMap;
        import java.util.List;
        import java.util.Map;
        /**
         * @软件包名 com.tgq.web
         * @用户 tgq
         * @create 2023-09-13 下午2:27
         * @注释说明:
         */
        @Controller
        //@ResponseBody
        //@RestController
        @RequestMapping("/sc/json")
        public class JsonController {
            @Autowired
            private MyStudentBiz myStudentBiz;
            @RequestMapping("/jsp")
            public String updateByPrimaryKeySelective() {
                return "json/list";
            }
            /**
             * 返回List<T>
             *
             * @param req
             * @param MyStudent
             * @return
             */
            @ResponseBody
            @RequestMapping("/list")
            public List<MyStudent> list(HttpServletRequest req, MyStudent MyStudent) {
                PageBean pageBean = new PageBean();
                pageBean.setRequest(req);
                List<MyStudent> list = this.myStudentBiz.selectPager(MyStudent, pageBean);
                return list;
            }
            /**
             * 返回T
             *
             * @param req
             * @param MyStudent
             * @return
             */
            @ResponseBody
            @RequestMapping("/load")
            public MyStudent load(HttpServletRequest req, MyStudent MyStudent) {
                if (MyStudent.getSname() != null) {
                    List<MyStudent> list = this.myStudentBiz.selectPager(MyStudent, null);
                    return list.get(0);
                }
                return null;
            }
            /**
             * 返回List<Map>
             *
             * @param req
             * @param MyStudent
             * @return
             */
            @ResponseBody
            @RequestMapping("/mapList")
            public List<Map> mapList(HttpServletRequest req, MyStudent MyStudent) {
                PageBean pageBean = new PageBean();
                pageBean.setRequest(req);
                List<Map> list = this.myStudentBiz.mapSelectPager(MyStudent, pageBean);
                return list;
            }
            /**
             * 返回Map
             *
             * @param req
             * @param MyStudent
             * @return
             */
            @ResponseBody
            @RequestMapping("/mapLoad")
            public Map mapLoad(HttpServletRequest req, MyStudent MyStudent) {
                if (MyStudent.getSname() != null) {
                    List<Map> list = this.myStudentBiz.mapSelectPager(MyStudent, null);
                    return list.get(0);
                }
                return null;
            }
            @ResponseBody
            @RequestMapping("/all")
            public Map all(HttpServletRequest req, MyStudent MyStudent) {
                PageBean pageBean = new PageBean();
                pageBean.setRequest(req);
                List<MyStudent> list = this.myStudentBiz.selectPager(MyStudent, pageBean);
                Map map = new HashMap();
                map.put("list", list);
                map.put("pageBean", pageBean);
                return map;
            }
            @ResponseBody//注释 跳的就是页面,就不是显示的字符串
            @RequestMapping("/jsonStr")
            public String jsonStr(HttpServletRequest req, MyStudent MyStudent) {
                return "sc-edit";
            }
        }

        image.gif

        4.2、biz层

        @Override
            public List<Map> mapSelectPager(MyStudent myStudent, PageBean pageBean) {
                return myStudentMapper.mapSelectPager(myStudent);
            }

        image.gif

        4.3、sql.xml

        <select id="mapSelectPager" resultType="java.util.Map" parameterType="com.tgq.model.MyStudent">
                select *
                from t_mysql_student
                <where>
                    <if test="sname != null"/>
                    and sname like concat('%',#{sname},'%')
                </where>
            </select>

        image.gif

        4.4、页面

        <%--
          Created by IntelliJ IDEA.
          User: tgq
          Date: 13/9/2023
          Time: 下午2:43
          To change this template use File | Settings | File Templates.
        --%>
        <%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <html>
        <head>
            <title>Title</title>
        </head>
        <body>
        <h3>JSON</h3>
        <a href="${pageContext.request.contextPath}/sc/json/list?sname=">返回List&lt;T&gt;</a>
        <hr>
        <a href="${pageContext.request.contextPath}/sc/json/mapList?sname=">返回List&lt;Map&gt;</a>
        <hr>
        <a href="${pageContext.request.contextPath}/sc/json/load?sname=三">返回T</a>
        <hr>
        <a href="${pageContext.request.contextPath}/sc/json/mapLoad?sname=三">返回Map</a>
        <hr>
        <a href="${pageContext.request.contextPath}/sc/json/all?sname=">返回混合</a>
        <hr>
        <a href="${pageContext.request.contextPath}/sc/json/jsonStr">返回JSON字符串</a>
        <hr>
        </body>
        </html>

        image.gif

        4.5、测试

        http://localhost:8080/sc/json/jsp

        image.gif编辑

        image.gif编辑

        image.gif编辑

        image.gif编辑

        image.gif编辑

        image.gif编辑

        image.gif编辑

        4.6、注意@ResponseBody

        如果在类名上面加上@ResponseBody注解,里面所有的方法返回的都会是字符串

        image.gif编辑

        @RestController:可以代替@Controller@ResponseBody

        image.gif编辑

        二、异常处理

        1、为什么要使用全局异常处理

        全局异常处理是一种在应用程序中集中处理异常的方式。它的主要目的是提供一种统一的机制来处理应用程序中抛出的异常,而不是在每个可能抛出异常的地方都进行单独的处理。

        使用全局异常处理的好处:

          1. 代码简洁:通过全局异常处理,我们可以将异常处理逻辑从业务代码中分离出来,使业务代码更加简洁和清晰。业务代码只需要关注核心业务逻辑,而将异常处理交给专门的异常处理器。
          2. 统一异常处理:全局异常处理提供了一种统一的机制来处理应用程序中的异常。无论是在控制器中处理请求时抛出的异常,还是在服务层、持久层或其他地方抛出的异常,都可以在全局异常处理器中进行处理。这样可以确保应用程序中的所有异常都能得到统一的处理,提高开发效率和代码质量。
          3. 异常信息友好化:通过全局异常处理,我们可以自定义异常信息的格式和内容,使其更加友好和易于理解。我们可以根据具体的业务需求,将异常信息转化为适合用户展示的形式,或者记录到日志中以便问题排查。
          4. 统一异常返回:在全局异常处理中,我们可以统一定义异常返回的格式和内容。例如,可以定义一个通用的错误响应对象,用于封装异常信息,并统一返回给客户端。这样可以避免在每个控制器方法中都手动处理异常并返回错误信息。
          5. 安全性:通过全局异常处理,我们可以捕获并处理未被处理的异常,防止异常信息暴露给客户端,从而提高应用程序的安全性。

          全局异常处理提供了一种集中处理应用程序中异常的方式,简化了代码逻辑,提高了代码的可读性和可维护性。它使我们能够更好地处理异常、优化用户体验,并提高应用程序的稳定性和安全性。

          2、异常处理思路

          第一种思路:

          系统的dao、service、controller出现异常都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。

          也可以遵循第二种思路:

            1. 捕获异常:在代码中使用try-catch语句块捕获可能抛出的异常。在try块中放置可能抛出异常的代码,而在catch块中处理捕获的异常。可以根据不同的异常类型,使用多个catch块分别处理不同类型的异常。
            2. 日志记录:在异常处理过程中,应该记录异常信息,以便后续的问题排查和调试。可以使用日志框架(如Log4j、Slf4j等)记录异常信息,包括异常类型、异常消息、堆栈跟踪等。通过日志记录,可以及时发现和解决潜在的问题。
            3. 友好提示:根据具体的业务需求,可以将异常信息转化为友好的提示信息,以便用户理解和处理。可以通过自定义异常类,设置异常的错误码和错误信息,然后根据错误码返回相应的提示信息给用户。
            4. 异常返回:在Web应用中,可以使用全局异常处理器将异常信息封装为统一的错误响应,并返回给客户端。这样可以提供统一的异常处理逻辑,避免在每个控制器方法中都手动处理异常。
            5. 异常链传递:在捕获异常后,可以通过抛出新的异常或将原始异常作为参数传递给上层调用者,以便上层调用者能够处理该异常。通过异常链的方式,可以将异常信息传递到合适的地方进行处理。
            6. 异常处理策略:对于可恢复的异常,可以采取相应的处理策略,尝试恢复正常的程序执行。例如,可以重新连接数据库、重新发送请求等。对于不可恢复的异常,可以通知相关人员或进行紧急处理。
            7. 异常监控和统计:可以使用监控工具或日志分析工具对异常进行监控和统计,以便及时发现和解决异常问题。通过收集和分析异常信息,可以帮助优化系统性能和提高用户体验。

            处理异常的思路是捕获异常、记录异常、友好提示、异常返回,根据具体情况采取合适的处理策略,并进行异常监控和统计。通过良好的异常处理,可以提高应用程序的稳定性和可维护性,优化用户体验,并及时发现和解决潜在的问题。

            3、SpringMVC异常分类

              • 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
              • 实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
              • 使用@ControllerAdvice + @ExceptionHandler
                1. 控制器异常:控制器异常是在处理客户端请求时发生的异常。这些异常通常由控制器方法抛出,可以包括验证错误、请求参数错误等。可以使用@ExceptionHandler注解来处理控制器异常,将异常处理逻辑集中在一个地方,统一返回错误信息给客户端。
                2. 服务层异常:服务层异常通常由业务逻辑引起,例如数据查询失败、业务规则校验失败等。服务层异常应该在服务层中进行捕获和处理,可以使用try-catch语句块或自定义的异常处理器来处理服务层异常。
                3. 数据访问异常:数据访问异常主要由数据库操作引起,例如数据库连接失败、SQL语句执行错误等。在Spring MVC中,可以使用Spring的数据访问框架(如Spring Data JPA、MyBatis等)来处理数据访问异常,框架会自动将底层的异常转化为Spring的数据访问异常(如DataAccessException)。
                4. 全局异常:全局异常是指在应用程序中没有被捕获和处理的异常,或者是无法预知的异常。可以使用全局异常处理器(@ControllerAdvice注解)来处理全局异常,将异常处理逻辑集中在一个地方,以便统一处理和返回错误信息。
                5. 运行时异常:运行时异常(RuntimeException)是一种不需要显式捕获和处理的异常。这些异常通常是由程序错误或逻辑错误引起的,例如空指针异常、数组越界异常等。在Spring MVC中,运行时异常会被Servlet容器捕获并返回默认的错误页面(如500 Internal Server Error页面)。

                对于不同类型的异常,可以根据具体需求选择不同的处理方式。有些异常可以通过捕获和处理来恢复正常的程序执行,而有些异常可能需要通知相关人员或进行紧急处理。通过合理分类和处理异常,可以提高应用程序的稳定性和可维护性。

                4、异常案例

                4.1、异常处理方法一

                SpringMVC中自带了一个异常处理器叫SimpleMappingExceptionResolver,该处理器实现了HandlerExceptionResolver 接口,全局异常处理器都需要实现该接口。

                spring-mvc.xml

                <!-- springmvc提供的简单异常处理器 -->
                    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
                        <!-- 定义默认的异常处理页面 -->
                        <property name="defaultErrorView" value="error"/>
                        <!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception -->
                        <property name="exceptionAttribute" value="ex"/>
                        <!-- 定义需要特殊处理的异常,这是重要点 -->
                        <property name="exceptionMappings">
                            <props>
                                <prop key="java.lang.RuntimeException">error</prop>
                            </props>
                            <!-- 还可以定义其他的自定义异常 -->
                        </property>
                    </bean>

                image.gif

                页面跳转由SpringMVC来接管了,所以此处的定义默认的异常处理页面都应该配置成逻辑视图名。

                @RequestMapping("/error")
                    public String error(MyStudent MyStudent) {
                        MyStudent = null;
                        MyStudent.getSname();
                        return "error";
                    }

                image.gif

                写一个异常的界面

                <%--
                  Created by IntelliJ IDEA.
                  User: tgq
                  Date: 13/9/2023
                  Time: 下午6:10
                  To change this template use File | Settings | File Templates.
                --%>
                <%@ page contentType="text/html;charset=UTF-8" language="java" %>
                <html>
                <head>
                    <title>error</title>
                </head>
                <body>
                错误信息....
                ${ex}
                </body>
                </html>

                image.gif

                测试一下效果

                http://localhost:8080/sc/json/error

                image.gif编辑

                4.2、异常处理方法二

                创建两个包image.gif编辑里面写两个类

                GlobalException

                package com.tgq.exception;
                public class GlobalException extends RuntimeException {
                    public GlobalException() {
                    }
                    public GlobalException(String message) {
                        super(message);
                    }
                    public GlobalException(String message, Throwable cause) {
                        super(message, cause);
                    }
                    public GlobalException(Throwable cause) {
                        super(cause);
                    }
                    public GlobalException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
                        super(message, cause, enableSuppression, writableStackTrace);
                    }
                }
                image.gif

                 

                GlobalExceptionHandler

                package com.tgq.component;
                import com.tgq.exception.GlobalException;
                import org.springframework.stereotype.Component;
                import org.springframework.web.servlet.HandlerExceptionResolver;
                import org.springframework.web.servlet.ModelAndView;
                import javax.servlet.http.HttpServletRequest;
                import javax.servlet.http.HttpServletResponse;
                @Component
                public class GlobalExceptionHandler implements HandlerExceptionResolver {
                    @Override
                    public ModelAndView resolveException(HttpServletRequest httpServletRequest,
                                                         HttpServletResponse httpServletResponse,
                                                         Object o, Exception e) {
                        ModelAndView mv = new ModelAndView();
                        mv.setViewName("error");
                        if (e instanceof GlobalException) {
                            GlobalException globalException = (GlobalException) e;
                            mv.addObject("ex", globalException.getMessage());
                            mv.addObject("msg", "全局异常....");
                        } else if (e instanceof RuntimeException) {
                            RuntimeException runtimeException = (RuntimeException) e;
                            mv.addObject("ex", runtimeException.getMessage());
                            mv.addObject("msg", "运行时异常....");
                        } else if (e instanceof RuntimeException) {
                            RuntimeException runtimeException = (RuntimeException) e;
                            mv.addObject("ex", e.getMessage());
                            mv.addObject("msg", "其他异常....");
                        }
                        return mv;
                    }
                }
                image.gif

                后面也可自定义异常

                写一个方法测试

                @RequestMapping("/error02")
                    public String error2(HttpServletRequest req) {
                      if (true)
                          throw new GlobalException("老异常了");
                        return "error";
                    }

                image.gif

                页面代码

                <%@ page contentType="text/html;charset=UTF-8" language="java" %>
                <html>
                <head>
                    <title>error</title>
                </head>
                <body>
                错误信息....
                ${msg}
                </body>
                </html>

                image.gif

                http://localhost:8080/sc/json/error02

                image.gif编辑

                4.3、异常处理方法三

                可以把component包里面的GlobalExceptionHandler 换成GlobalExceptionResolver
                GlobalExceptionResolver
                :里面返回的json格式和跳转页面

                package com.tgq.component;
                import com.tgq.exception.GlobalException;
                import org.springframework.web.bind.annotation.ControllerAdvice;
                import org.springframework.web.bind.annotation.ExceptionHandler;
                import org.springframework.web.bind.annotation.ResponseBody;
                import java.util.HashMap;
                import java.util.Map;
                @ControllerAdvice
                public class GlobalExceptionResolver {
                //    跳转错误页面
                //    @ExceptionHandler
                //    public ModelAndView handler(Exception e){
                //        ModelAndView mv = new ModelAndView();
                //        mv.setViewName("error");
                //        if (e instanceof GlobalException){
                //            GlobalException globalException = (GlobalException) e;
                //            mv.addObject("ex",globalException.getMessage());
                //            mv.addObject("msg","全局异常....");
                //        }else if (e instanceof RuntimeException){
                //            RuntimeException runtimeException = (RuntimeException) e;
                //            mv.addObject("ex",runtimeException.getMessage());
                //            mv.addObject("msg","运行时异常....");
                //        }
                //        return mv;
                //    }
                    // 返回错误json数据
                    @ResponseBody
                    @ExceptionHandler
                    public Map handler(Exception e) {
                        Map map = new HashMap();
                        if (e instanceof GlobalException) {
                            GlobalException globalException = (GlobalException) e;
                            map.put("ex", globalException.getMessage());
                            map.put("msg", "全局异常....");
                        } else if (e instanceof RuntimeException) {
                            RuntimeException runtimeException = (RuntimeException) e;
                            map.put("ex", runtimeException.getMessage());
                            map.put("msg", "运行时异常....");
                        } else {
                            map.put("ex", e.getMessage());
                            map.put("msg", "其它异常....");
                        }
                        return map;
                    }
                }

                image.gif

                测试结果

                json格式

                image.gif编辑

                页面

                image.gif编辑


                相关实践学习
                【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
                【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
                相关文章
                |
                11月前
                |
                JSON API 数据格式
                淘宝拍立淘按图搜索API系列,json数据返回
                淘宝拍立淘按图搜索API系列通过图像识别技术实现商品搜索功能,调用后返回的JSON数据包含商品标题、图片链接、价格、销量、相似度评分等核心字段,支持分页和详细商品信息展示。以下是该API接口返回的JSON数据示例及详细解析:
                |
                11月前
                |
                JSON 算法 API
                Python采集淘宝商品评论API接口及JSON数据返回全程指南
                Python采集淘宝商品评论API接口及JSON数据返回全程指南
                |
                11月前
                |
                JSON API 数据安全/隐私保护
                Python采集淘宝拍立淘按图搜索API接口及JSON数据返回全流程指南
                通过以上流程,可实现淘宝拍立淘按图搜索的完整调用链路,并获取结构化的JSON商品数据,支撑电商比价、智能推荐等业务场景。
                |
                11月前
                |
                前端开发 Java 微服务
                《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
                Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
                |
                11月前
                |
                JSON 中间件 Java
                【GoGin】(3)Gin的数据渲染和中间件的使用:数据渲染、返回JSON、浅.JSON()源码、中间件、Next()方法
                我们在正常注册中间件时,会打断原有的运行流程,但是你可以在中间件函数内部添加Next()方法,这样可以让原有的运行流程继续执行,当原有的运行流程结束后再回来执行中间件内部的内容。​ c.Writer.WriteHeaderNow()还会写入文本流中。可以看到使用next后,正常执行流程中并没有获得到中间件设置的值。接口还提供了一个可以修改ContentType的方法。判断了传入的状态码是否符合正确的状态码,并返回。在内部封装时,只是标注了不同的render类型。再看一下其他返回的类型;
                477 3
                |
                11月前
                |
                JSON Java Go
                【GoGin】(2)数据解析和绑定:结构体分析,包括JSON解析、form解析、URL解析,区分绑定的Bind方法
                bind或bindXXX函数(后文中我们统一都叫bind函数)的作用就是将,以方便后续业务逻辑的处理。
                555 3
                |
                JSON 定位技术 PHP
                PHP技巧:解析JSON及提取数据
                这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
                371 67
                |
                JSON JavaScript 测试技术
                掌握JMeter:深入解析如何提取和利用JSON数据
                Apache JMeter教程展示了如何提取和使用JSON数据。创建测试计划,包括HTTP请求和JSON Extractor,设置变量前缀和JSON路径表达式来提取数据。通过Debug Sampler和View Results Tree监听器验证提取结果,然后在后续请求和断言中使用这些数据。此方法适用于复杂测试场景,提升性能和自动化测试效率。
                |
                JSON 缓存 API
                解析电商商品详情API接口系列,json数据示例参考
                电商商品详情API接口是电商平台的重要组成部分,提供了商品的详细信息,支持用户进行商品浏览和购买决策。通过合理的API设计和优化,可以提升系统性能和用户体验。希望本文的解析和示例能够为开发者提供参考,帮助构建高效、可靠的电商系统。
                801 12
                |
                存储 JSON API
                淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
                ——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 淘宝API接口(如淘宝开放平台提供的API)允许开发者获取淘宝商品的各种信息,包括商品详情。然而,需要注意的是,直接访问淘宝的商品数据API通常需要商家身份或开发者权限,并且需要遵循淘宝的API使用协议。
                淘系API接口(解析返回的json数据)商品详情数据解析助力开发者