Springmvc--JSON

  • JSON(JavaScript Object Notation,js 对象标记)是一种轻量级的数据交换格式,目前使用特别广泛。
  • 采用完全独立于编程语言的文本格式来存储和表示数据。
  • 简洁清晰的层次结构使得json成为理想的数据交换语言
  • 易于人的阅读和编写,同时也易于机器解析和生成,并有效提高网络传输效率。
    在JavaScript语言中,一切皆对象。因此,任何JavaScript支持的类都可以通过JSON来表示,例如字符串、数字、对象、数组等。
  • 对象表示为键值对,数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组
    例如:{“name”:“yf”,“age”:21,“sex”:“男”}
    这种就表示一个对象

JSON键值对是用来保存JavaScript对象的一种方式,和JavaScript对象的写法也大同小异。
例如JSON和JavaScript的相互转换

<script type="text/javascript">
        //编写一个JavaScript对象
        var student = {
            name:"yf",
            age:21,
            sex:"男"
        }
        //将这个对象转换为JSON
        var json = JSON.stringify(student);
        console.log(json);
        console.log("================")
        //将json转化为一个对象
        var student1 = JSON.parse(json);
        console.log(student1);
    </script>

在controller中将输出的对象转换为JSON字符串

@RequestMapping("/j1")
    @ResponseBody //这样就不会走视图解析器,直接返回一个字符串
    public String json1() throws JsonProcessingException {

        ObjectMapper objectMapper = new ObjectMapper();

        User user = new User("yf", 21, "男");
        String s = objectMapper.writeValueAsString(user);
        return s;
    }

返回集合类型的操作方法也是一样的

    public String json1() throws JsonProcessingException {

        ObjectMapper objectMapper = new ObjectMapper();

        User user = new User("yf", 21, "男");
        User user2 = new User("yf", 21, "男");
        User user3 = new User("yf", 21, "男");
        User user4 = new User("yf", 21, "男");
        List<User> list = new ArrayList<>();
        list.add(user);
        list.add(user2);
        list.add(user3);
        list.add(user4);
        String s = objectMapper.writeValueAsString(list);
        return s;
    }

@ResponseBody这个注解让controller方法不走视图解析器,直接将返回值输出到前端。
@RestController这个注解让整个controller类不走视图解析器,直接将返回值输出到前端。
ObjectMapper就是JackSon里面的类,可以将对象转化为Json字符串。
结果就是这样的
在这里插入图片描述
但是注意到这里是乱码的

乱码解决办法

在@RequestMapping里面有一个 products属性
这个属性中可以设置json输出编码

@RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")

上一种方法比较麻烦,如果项目中有许多请求则每一个都要添加,可以通过spring配置统一指定,这样就不用每次去处理了。
在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>

输出时间的两种方式

如果使用date直接输出,输出到前端的是时间戳,看不懂
解决方法:

  • 使用SimpleDateFormat
    @RequestMapping("/j2")
    public String json2() throws JsonProcessingException {

        ObjectMapper mapper = new ObjectMapper();
        Date date = new Date();
        //自定义时间格式
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = dateFormat.format(date);
        String s = mapper.writeValueAsString(format);
        return s;
    }
  • 不使用时间戳的方式
    @RequestMapping("/j2")
    public String json2() throws JsonProcessingException {

        ObjectMapper mapper = new ObjectMapper();
        //不使用时间戳的方式
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
        Date date = new Date();
        //自定义时间格式
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        mapper.setDateFormat(dateFormat);
        String s = mapper.writeValueAsString(date);
        return s;
    }

JsonUtile

先写一个关于时间转换的工具类。

    public static String getJson(Object object,String dateFormat){
        ObjectMapper mapper = new ObjectMapper();

        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);

        SimpleDateFormat format = new SimpleDateFormat(dateFormat);

        mapper.setDateFormat(format);

        String s = null;
        try {
            s = mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

        return s;
    }

然后再写一个普通对象的转换,使用重载,你可能会重新写过一遍objectMapper什么的,但是其实没必要,直接调用前面那个处理时间的就行,dateFormat传递一个默认值就行。

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

看这多方便对吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值