springmvc-03

springmvc-03,第1张

springmvc-03

json:

一种数据交换的中间商

在前后段分离的时期

json与jsvascript对象的相互转换




    
    Title
    




在controller中返回json数据:

使用Jackson,首先导入依赖(不导包的话就自己写一下json的格式,直接用就行)



    com.fasterxml.jackson.core
    jackson-databind
    2.13.1

 

配置web.xml(基本上已经固定了)

    
        springmvc
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            classpath:springmvc.xml
        
        1
    
    
        springmvc
        /
    

    
        encoding
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            utf-8
        
    
    
        encoding
        /*
    

创建一个User类(自己看着建)

注:在函数上添加 @ResponseBody 注解,将使该块不走视图解析器,直接按照字符串的样子返回到网页

@RestController这个注解直接在类上加,该类中所有方法都不会被视图解析器解析

在controller中通过 ObjectMapper(jaclson的对象映射器) 对象的  writevalueAsString() 方法将str转换为json对象

@Controller
public class JsonController {
    @RequestMapping("/j1")
    @ResponseBody
    public String test1() throws JsonProcessingException {
        //使用 ObjectMapper 对象将string转化为json
        ObjectMapper mapper = new ObjectMapper();
        User user =new User("陈东1",12,"男");
        //调用
        String str=mapper.writevalueAsString(user);
        return str;
    }
}

这是直接将String类型返回的样子(java)

这是经过转换后的样子(json)

 对于乱码问题,可以通过RequestMapping中的proudect参数来设置

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

这种只能用于小问题,如果很多函数体都需要加参数的话,就很麻烦了

所以,(直接拷贝)在springmvc的配置文件中增加一下代码,就ok了


   
       
           
       
       
           
               
                   
               
           
       
   

返回一个时间类,其正常是一个时间戳(从1970.1.1开始到现在的毫秒?)

    @RequestMapping( "/j2")
    @ResponseBody
    public String test2() throws JsonProcessingException {
        //使用 ObjectMapper 对象将string转化为json
        ObjectMapper mapper = new ObjectMapper();
        Date date=new Date();
        //调用
        String str=mapper.writevalueAsString(date);
        return str;
    }

正常人都看不出来的东西,不适用时间戳

方法一:java

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

方法二:spring

//不使用时间戳的格式
@RequestMapping( "/j2")
@ResponseBody
public String test2() throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    //自定义时间格式
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    mapper.setDateFormat(sdf);
    Date date=new Date();
    String str=mapper.writevalueAsString(date);
    return str;
}

两种方法都需要自定义时间格式 使用 SimpleDateFormat 类创建新的时间格式,格式有固定要求

很容易可以看出,转换为json的jackson方法,魔板都出来了,所以我们将他整合为一个工具类

 思考:工具类应该怎么写,应该按照我们正常调用的程序,将里面所用到的方法封装起来,露出方法名,执行的过程和我们正常写程序应该是一样的。就这个例子来说,我们想把String转换为json格式,需要new一个ObjectMapper ,为了部使用时间戳 mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) 需要加上这个,然后就是设置时间的格式,我们可以让他固定,也可以自由(通过参数设置),还要设置一下spring使用这个样式。最后就是返回了,writevalueAsString。

对于相似的方法,可以重载。

package com.kuang.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.text.SimpleDateFormat;

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 form) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        //自定义时间格式
        SimpleDateFormat sdf = new SimpleDateFormat(form);
        mapper.setDateFormat(sdf);

        try {
            return mapper.writevalueAsString(object);
        }catch (JsonProcessingException e){
            e.printStackTrace();
        }
        return null;
    }
}

fastjson:阿里巴巴的作品,很中国化,看源码都能理解一些

导包:(看样子用的人不是很多)



    com.alibaba
    fastjson
    1.2.78

然后,搬过来,以后要用我就回来看看

public class FastJsonDemo {
   public static void main(String[] args) {
       //创建一个对象
       User user1 = new User("秦疆1号", 3, "男");
       User user2 = new User("秦疆2号", 3, "男");
       User user3 = new User("秦疆3号", 3, "男");
       User user4 = new User("秦疆4号", 3, "男");
       List list = new ArrayList();
       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);
  }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5717267.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存