JSON JSON (JavaScript  Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript  (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。 
采用完全独立于编程语言的文本格式 来存储和表示数据。 
简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 
易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。 
 
在 JavaScript 语言中,一切都是对象。因此,任何JavaScript 支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式:
对象表示为键值对,数据由逗号分隔 
花括号保存对象 
方括号保存数组 
 
JSON 键值对 是用来保存 JavaScript 对象的一种方式,和 JavaScript 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 “” 包裹,使用冒号 : 分隔,然后紧接着值
JSON 与 JS 对象的关系 很多人搞不清楚 JSON 和 JS 对象的关系,甚至连谁是谁都不清楚。其实,可以这么理解:
JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。 
JSON 和 JS 对象互转 要实现从JSON字符串转换为JS对象,使用 JSON.parse() 方法
要实现从JS对象转换为JSON字符串,使用 JSON.stringify() 方法
Jackson 
建立一个SpringMvc项目。导入相关的依赖和jackson依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46   <dependency >             <groupId > com.fasterxml.jackson.core</groupId >              <artifactId > jackson-databind</artifactId >              <version > 2.9.8</version >          </dependency >                   <dependency >              <groupId > org.springframework</groupId >              <artifactId > spring-webmvc</artifactId >              <version > 5.1.9.RELEASE</version >          </dependency >          <dependency >              <groupId > org.springframework</groupId >              <artifactId > spring-jdbc</artifactId >              <version > 5.1.9.RELEASE</version >          </dependency >          <dependency >              <groupId > org.projectlombok</groupId >              <artifactId > lombok</artifactId >              <version > 1.18.12</version >          </dependency >                   <dependency >              <groupId > javax.servlet</groupId >              <artifactId > servlet-api</artifactId >              <version > 2.5</version >          </dependency >          <dependency >              <groupId > javax.servlet.jsp</groupId >              <artifactId > jsp-api</artifactId >              <version > 2.2</version >          </dependency >          <dependency >              <groupId > javax.servlet</groupId >              <artifactId > jstl</artifactId >              <version > 1.2</version >          </dependency >          <dependency >              <groupId > junit</groupId >              <artifactId > junit</artifactId >              <version > 4.11</version >              <scope > test</scope >  </dependency > 
SpringMVC配置文件——springmvc-servlet.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 <?xml version="1.0" encoding="UTF-8"?> <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.kylin.controller" />           <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 >           <bean  class ="org.springframework.web.servlet.view.InternalResourceViewResolver"             id ="internalResourceViewResolver" >                  <property  name ="prefix"  value ="/WEB-INF/jsp/" />                   <property  name ="suffix"  value =".jsp" />      </bean >           <mvc:resources  location ="/static/"  mapping ="/static/**"  />  </beans > 
web.xml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 <?xml version="1.0" encoding="UTF-8"?> <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 > SpringMVC</servlet-name >      <servlet-class > org.springframework.web.servlet.DispatcherServlet</servlet-class >           <init-param >        <param-name > contextConfigLocation</param-name >        <param-value > classpath:springmvc-servlet.xml</param-value >      </init-param >           <load-on-startup > 1</load-on-startup >    </servlet >       <servlet-mapping >      <servlet-name > SpringMVC</servlet-name >      <url-pattern > /</url-pattern >    </servlet-mapping >    <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 >    <filter-mapping >      <filter-name > encoding</filter-name >      <url-pattern > /</url-pattern >    </filter-mapping >  </web-app > 
创建一个pojo包,User类。(构造器,getter和setter方法,重写toString)
1 2 3 4 5 public  class  User      private  String name;     private  int  age;     private  String sex;   } 
创建一个controller类,编写一个UserController类。
注意:由于使用的是SpringMVC。正常返回他会走视图解析器,而json需要返回的是一个字符串。所有我们使用ResponseBody注解。但是由于SpringMVC的@ResponseBody注解集成Jackson。返回对象就会自动转换成Json字符串。 
首先创建一个jackson的对象映射器,用来解析数据
ObjectMapper mapper = new ObjectMapper();
使用writeValueAsString(Object) 转换成Json字符串
mapper.writeValueAsString(Object);
直接返回User对象
我们发现使用Jackson转换对象为json字符串出现了乱码我们可以在RequestMapping注解中的produces配置编码格式produces = "application/json;charset=utf-8"
解决了乱码问题!
但是没错这样配置还是有点麻烦。我么可以通过配置SpringMVC的配置文件配置mvc:annotation-driven中的mvc:message-converters
在编写一个请求,将一个list对象转换为json字符串
此时我们没有配置RequestMapping注解中的produces配置编码格式。也不会出现乱码问题了
默认日期格式会变成一个数字,是1970年1月1日到当前日期的毫秒数! 
Jackson 默认是会把时间转成timestamps形式 
 
解决方案:取消timestamps形式 , 自定义时间格式mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 
输出指定格式日期
将日期格式抽取为一个工具类。创建一个utils包,编写一个JsonUtils类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public  class  JsonUtils      public  static  String getJson (Date date)          return  getJson(date,"yyyy-MM-dd HH:mm:ss" );     }     public  static  String getJson (Date date, String pattern)           ObjectMapper mapper = new  ObjectMapper();                  mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false );                  SimpleDateFormat sdf = new  SimpleDateFormat(pattern);                  mapper.setDateFormat(sdf);         String str = null ;         try  {             str = mapper.writeValueAsString(date);         } catch  (JsonProcessingException e) {             e.printStackTrace();         }         return  str;     } } 
成功!
FastJson 
fastjson.jar是阿里开发的一款专门用于Java开发的包,可以方便的实现json对象与JavaBean对象的转换,实现JavaBean对象与json字符串的转换,实现json对象与json字符串的转换。实现json的转换方法很多,最后的实现结果都是一样的。
导入fastjson的pom依赖
1 2 3 4 5 <dependency >    <groupId > com.alibaba</groupId >     <artifactId > fastjson</artifactId >     <version > 1.2.60</version >  </dependency > 
提供服务器端、安卓客户端两种解析工具,性能表现较好。 
提供了 toJSONString()  和 parseObject()  方法来将 Java 对象与 JSON 相互转换。调用toJSONString方 法即可将对象转换成 JSON 字符串,parseObject 方法则反过来将 JSON 字符串转换成对象。 
允许转换预先存在的无法修改的对象(只有class、无源代码)。 
Java泛型的广泛支持。 
允许对象的自定义表示、允许自定义序列化类。 
支持任意复杂对象(具有深厚的继承层次和广泛使用的泛型类型)。 
 
编写一个FastJsonDemo类进行测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 public  class  FastJsonDemo      public  static  void  main (String[] args)                    User user1 = new  User("kylin1号" , 3 , "男" );         User user2 = new  User("kylin2号" , 3 , "男" );         User user3 = new  User("kylin3号" , 3 , "男" );         User user4 = new  User("kylin4号" , 3 , "男" );         List<User> list = new  ArrayList<User>();         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("\n****** JSON字符串 转 Java对象*******" );         User jp_user1 = JSON.parseObject(str2, User.class);         System.out.println("JSON.parseObject(str2,User.class)==>"  + jp_user1);         System.out.println("\n****** Java对象 转 JSON对象 ******" );         JSONObject jsonObject1 = (JSONObject) JSON.toJSON(user2);         System.out.println("(JSONObject) JSON.toJSON(user2)==>"  + jsonObject1.getString("name" ));         System.out.println("\n****** JSON对象 转 Java对象 ******" );         User to_java_user = JSON.toJavaObject(jsonObject1, User.class);         System.out.println("JSON.toJavaObject(jsonObject1, User.class)==>"  + to_java_user);     } }