Json

json概念

  • JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
  • 它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
  • 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
  • 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

在 JavaScript 语言中,一切都是对象。因此,任何JavaScript 支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式:

  • 对象表示为键值对,数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

JSON 与 JS 对象的关系

很多人搞不清楚 JSON 和 JS 对象的关系,甚至连谁是谁都不清楚。其实,可以这么理解:
JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。

var obj = {
   a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串

JSON 和 JS 对象互转

要实现从JSON字符串转换为JS对象,使用 JSON.parse() 方法:

var obj = JSON.parse('{"a": "Hello", "b": "World"}'); //结果是 {a: 'Hello', b: 'World'}

要实现从JS对象转换为JSON字符串,使用 JSON.stringify() 方法:

var json = JSON.stringify({
   a: 'Hello', b: 'World'}); //结果是 '{"a": "Hello", "b": "World"}'

Springmvc乱码问题

方法一:使用springmvc提供的过滤器,在web.xml中配置如下

    <!--SpringMVC给我们提供了一个过滤器:解决乱码问题 -->
    <!--
 <filter>
     <filter-name>encoding</filter-name>
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
     <init-param>
         <param-name>encoding</param-name>
         <param-value>utf-8</param-value>
     </init-param>
 </filter>
 -->

方法二:自己封装过滤器,建立如下类

package com.cqu.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;

/** * 解决get和post请求 全部乱码的过滤器 */
public class GenericEncodingFilter implements Filter {
   
    public void destroy() {
   
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
   
        //处理response的字符编码
        HttpServletResponse myResponse = (HttpServletResponse) response;
        myResponse.setContentType("text/html;charset=UTF-8");

        // 转型为与协议相关对象
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        // 对request包装增强
        HttpServletRequest myrequest = new MyRequest(httpServletRequest);
        chain.doFilter(myrequest, response);
    }


    public void init(FilterConfig filterConfig) throws ServletException {
   
    }

}

//自定义request对象,HttpServletRequest的包装类
class MyRequest extends HttpServletRequestWrapper {
   

    private HttpServletRequest request;
    //是否编码的标记

    private boolean hasEncode;
//定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰


    public MyRequest(HttpServletRequest request) {
   
        super(request);// super必须写
        this.request = request;
    }

// 对需要增强方法 进行覆盖


    public Map getParameterMap() {
   
// 先获得请求方式
        String method = request.getMethod();
        if (method.equalsIgnoreCase("post")) {
   
// post请求
            try {
   
// 处理post乱码
                request.setCharacterEncoding("utf-8");
                return request.getParameterMap();
            } catch (UnsupportedEncodingException e) {
   
                e.printStackTrace();
            }
        } else if (method.equalsIgnoreCase("get")) {
   
// get请求
            Map<String, String[]> parameterMap = request.getParameterMap();
            if (!hasEncode) {
    // 确保get手动编码逻辑只运行一次
                for (String parameterName : parameterMap.keySet()) {
   
                    String[] values = parameterMap.get(parameterName);
                    if (values != null) {
   
                        for (int i = 0; i < values.length; i++) {
   
                            try {
   
// 处理get乱码
                                values[i] = new String(values[i].getBytes("ISO-8859-1"), "utf-8");
                            } catch (UnsupportedEncodingException e) {
   
                                e.printStackTrace();
                            }
                        }
                    }
                }
                hasEncode = true;
            }
            return parameterMap;
        }
        return super.getParameterMap();
    }


    public String getParameter(String name) {
   
        Map<String, String[]> parameterMap = getParameterMap();
        String[] values = parameterMap.get(name);
        if (values == null) {
   
            return null;
        }
        return values[0]; // 取回参数的第一个值
    }

//取所有值


    public String[] getParameterValues(String name) {
   
        Map<String, String[]> parameterMap = getParameterMap();
        String[] values = parameterMap.get(name);
        return values;
    }
}

接着在web.xml中配置 filter

 <!--自己设置过滤器,此处路径为:com.cqu.filter.GenericEncodingFilter-->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>com.cqu.filter.GenericEncodingFilter</filter-class>
    </filter>
 <filter-mapping>
     <filter-name>encoding</filter-name>
     <url-pattern>/*</url-pattern> </filter-mapping> 

json乱码问题

在springmvc-servlet.xml配置:

 <!--json乱码统一配置-->
    <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解析工具

这里介绍两个比较好的json解析工具:**Jackson,fastjson **

Jackson

  • 配置SpringMVC需要的配置
  • 导入jackson的maven依赖
 <dependency>
           <groupId>com.fasterxml.jackson.core</groupId>
           <artifactId>jackson-databind</artifactId>
           <version>2.10.0</version>
       </dependency>

其中实体类为:

@Data
@AllArgsConstructor// 生成一个包含所有参数的构造方法
@NoArgsConstructor//生成一个无参数的构造方法
public class User {
   
    private String name;
    private int age;
    private String sex;

}

其中工具类为:

public class JsonUtils {
   
    public static  String getJson(Object object) throws JsonProcessingException {
   
        return getJson(object,"yyyy-MM-dd HH:mm:ss");
       }
    public static  String getJson(Object object,String dateformat) throws JsonProcessingException {
   
        ObjectMapper mapper = new ObjectMapper();
        //不使用时间戳方式
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        //自定义日期格式对象
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateformat);
        //指定日期格式
        mapper.setDateFormat(simpleDateFormat);
        try {
   
            return mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
   
            e.printStackTrace();
        }
        return null;

    }
}

视图层测试:

//@Controller
@RestController
public class UserController {
   

    @RequestMapping("/json1")
    //@ResponseBody 配合@Controller使用,相当于@RestController
    public String json1() throws JsonProcessingException {
   
        ObjectMapper mapper = new ObjectMapper();
        User user = new User("罗天天", 20, "男");
        String s = mapper.writeValueAsString(user);
        return s;
    }
    @RequestMapping("/json2")
    public String json2() throws JsonProcessingException {
   
        ObjectMapper mapper = new ObjectMapper();
        User user = new User("罗天天", 22, "女");
        User user1 = new User("罗佳言", 21, "男");
        User user2 = new User("罗佳言", 23, "女");
        User user3 = new User("罗天天", 24, "男");
        ArrayList<User> users = new ArrayList<User>();
        users.add(user);
        users.add(user1);
        users.add(user2);
        users.add(user3);
        String s = mapper.writeValueAsString(users);
        return s;
    }
    @RequestMapping("/json3")
    public String json3() throws JsonProcessingException {
   
        User user3 = new User("罗天天", 24, "男");
        return JsonUtils.getJson(user3);
    }

    @RequestMapping("/json4")
    public String json4() throws JsonProcessingException {
   
        Date date = new Date();
        return JsonUtils.getJson(date);
    }
}

fastjson

fastjson.jar是阿里开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。实现json的转换方法很多,最后的实现结果都是一样的。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务