springmvc jackson与fastJson的使用

json只是文本格式,在java中就是String。

json格式优点:易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率

java中json解析工具有:Jackson、阿里巴巴的fastjson等

分别讲一下Jackson和fastjson

Jackson

Jackson导入jar包,导入jar记得更新lib,不然会classNotFound的

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.10.0</version>
</dependency>

随便编写一个User的实体类,要导入lombok

		<dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.8</version>
        </dependency>
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private int age;
    private String sex;

}

如果无法编译lombok,需要安装plugins。步骤如下:

  1. 右上角打开File ->Settings -> Plugins
  2. 点击Browse repositories,弹出框中输入lombok,安装
  3. 用lombok的时候记得把annotation processing开了
    在这里插入图片描述

编写Controller,新用到了@ResponseBody,和ObjectMapper对象

  • @RequestMapping中produces参数设置编码格式为utf-8,否则会出现乱码,还要设置文本类型为json

  • @ResponseBody:表示该方法返回字符串,不会经过视图解析器

  • ObjectMapper:jackson的对象映射器,用来解析数据

  • 用mapper.writeValueAsString转化为json格式

	@RequestMapping(value = "/json1", produces = "application/json;charset=utf-8")
    @ResponseBody
    public String json1() throws JsonProcessingException {
        //创建一个jackson的对象映射器,用来解析数据
        ObjectMapper mapper = new ObjectMapper();
        //创建一个对象
        User user = new User("yy", 3, "男");
        //将我们的对象解析成为json格式
        //由于@ResponseBody注解,这里会将str转成json格式返回;十分方便
        return mapper.writeValueAsString(user);
    }

每次写produces很麻烦,可以springmvc的配置文件上添加StringHttpMessageConverter配置统一指定

<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>

@RestController标注在类上,该类下的方法不用加@ResponseBody也返回字符串格式

@RestController
public class HelloController {
	@RequestMapping("/json1")
    public String json1() throws JsonProcessingException {
        User user1 = new User("uu", 3, "男");
        User user2 = new User("yy", 3, "男");
        List<User> list = new ArrayList<User>();
        list.add(user1);
        list.add(user2);
        return new ObjectMapper().writeValueAsString(list);
    }
    
}

返回结果:
在这里插入图片描述

当我们Date date = new Date();返回date时是时间戳类型,我们可以用mapper.setDateFormat设置返回date的格式,但每次用要写很多行代码,我们可以把它给封装起来作一个JsonUtils类

public class JsonUtils {

    public static String getJson(Object object) {
        return getJson(object,"yyyy-MM-dd HH:mm:ss");
    }

    public static String getJson(Object object,String dateFormat) {
        ObjectMapper mapper = new ObjectMapper();
        //不使用时间戳的方式
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        //自定义日期格式对象
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        //指定日期格式
        mapper.setDateFormat(sdf);
        try {
            return mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

每次调用用JsonUtils.getJson就行了

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

(超级像我当时写TP5项目时写的BaseController封装json.encode)

FastJson

FastJson库使用

老样子,先导入FastJson包,记得添加lib

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

FastJson有三个主要的类:

  1. JSONObject 代表 json 对象
    对应json对象,通过各种形式的get()方法可以获取json对象中的数据,也可利用诸如size(),isEmpty()等方法获取"键:值"对的个数和判断是否为空。其本质是通过实现Map接口并调用接口中的方法完成的。
  2. JSONArray 代表 json 对象数组
    内部是有List接口中的方法来完成操作的。
  3. JSON 代表JSONObject和JSONArray的转化
    仔细观察这些方法,主要是实现json对象,json对象数组,javabean对象,json字符串之间的相互转化。
    测试代码
	@RequestMapping("/json1")
    public String json1() throws JsonProcessingException {
        User user = new User("a", 3, "男");
        // 转json
        String str = JSON.toJSONString(user);
        // json转object
        User user1 = JSON.parseObject(str, User.class);
        System.out.println(user1);
        return JSON.toJSONString(user);

    }

阿里巴巴的FastJson用起来就更方便了,相当于utils已经给我们封装好了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值