zoukankan      html  css  js  c++  java
  • Json

    Json

    1.简介

    json(JavaScript Object Notation, JS对象标记) 是一种轻量级数据交换格式,目前使用非常广泛,json本质就是一个字符串

    json键值对 是用来保存jsvaScript对象的一种方式,和javaScript对象的写法也大同小异 ,例如: {"name": "zpk"}

    2. json和javaScript的区别

    json是javaScript对象的字符串表示法,它使用文本表示一个JS对象的信息,本质是一个字符串.

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

    3. json和javascript对象互转

    • json转为javascript
    var obj = Json.parse(json字符串);
    //例如: 
    var obj = Json.parse('{"a": "Hello", "b": "World"}');
    
    • javascript对象转为json
    var json = JSON.stringify(javaScript对象)
    //例如
    var json = JSON.stringify({a: 'hello',b: 'word'});
    

    4. json依赖,可以在mvc中使用controller返回json数据

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.8</version>
    </dependency>
    

    5. 编写controller测试

    • 这里我们需要两个新东西,一个是@ResponseBody,一个是ObjectMapper对象,我们看下具体的用法
    @Controller
    public class UserController {
    
        @RequestMapping("/json1")
        @ResponseBody
        public String json1() throws JsonProcessingException {
            //创建一个jackson的对象映射器,用来解析数据
            ObjectMapper mapper = new ObjectMapper();
            //创建一个对象
            User user = new User("1号", 3, "男");
            //将我们的对象解析成为json格式
            String str = mapper.writeValueAsString(user);
            //由于@ResponseBody注解,这里会将str转成json格式返回;十分方便
            return str;
        }
    
    }
    
    • 中文乱码解决
    //produces:指定响应体返回类型和编码
    @RequestMapping(value = "/json1",produces = "application/json;charset=utf-8")
    

    6.乱码统一解决

    • spring-mvc.xml配置文件中进行配置(消息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>
    

    7.如果这个controller统一是返回json数据,可以进行统一设置

    在类上直接使用@RestController注解,就不用在每一个方法上都添加@ResponseBody了,在前后端分离开发中经常使用这种方法

    @RestController
    public class UserController {
    
        //produces:指定响应体返回类型和编码
        @RequestMapping(value = "/json1")
        public String json1() throws JsonProcessingException {
            //创建一个jackson的对象映射器,用来解析数据
            ObjectMapper mapper = new ObjectMapper();
            //创建一个对象
            User user = new User("1号", 3, "男");
            //将我们的对象解析成为json格式
            String str = mapper.writeValueAsString(user);
            //由于@ResponseBody注解,这里会将str转成json格式返回;十分方便
            return str;
        }
    
    }
    

    8. 测试集合的输出

    @RequestMapping("/json2")
    public String json2() throws JsonProcessingException {
    
        //创建一个jackson的对象映射器,用来解析数据
        ObjectMapper mapper = new ObjectMapper();
        //创建一个对象
        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<User> list = new ArrayList<User>();
        list.add(user1);
        list.add(user2);
        list.add(user3);
        list.add(user4);
    
        //将我们的对象解析成为json格式
        String str = mapper.writeValueAsString(list);
        return str;
    }
    

    9. 输出时间对象

    @RequestMapping("/json3")
    public String json3() throws JsonProcessingException {
    
        ObjectMapper mapper = new ObjectMapper();
    
        //创建时间一个对象,java.util.Date
        Date date = new Date();
        //将我们的对象解析成为json格式
        String str = mapper.writeValueAsString(date);
        return str;
    }
    
    • 输出结果为1970年1月1号到现在的毫秒数

    • Jackson 默认是会把时间转成timestamps形式

    解决方案: 取消timestamps形式 , 自定义时间格式

    @RequestMapping("/json4")
    public String json4() 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;
    }
    
    • 结果正常

    抽取为工具类

    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) {
            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;
        }
    }
    
  • 相关阅读:
    递归函数及Java范例
    笔记本的硬盘坏了
    “References to generic type List should be parameterized”
    配置管理软件(configuration management software)介绍
    WinCE文件目录定制及内存调整
    使用Silverlight for Embedded开发绚丽的界面(3)
    wince国际化语言支持
    Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
    WinCE Heartbeat Message的实现
    使用Silverlight for Embedded开发绚丽的界面(2)
  • 原文地址:https://www.cnblogs.com/zpKang/p/12671443.html
Copyright © 2011-2022 走看看