• Jackson


    Jackson

    一、JSON

    1、简介

    JSON: JavaScript Object Notation(JavaScript 对象表示法)

    JSON 是存储和交换文本信息的语法。类似 XML

    JSON 比 XML 更小、更快,更易解析。

    JSON可以被各种语言使用

    2、语法

    2.1、json主要通过键值对保存数据
    2.2、内容可以是对象、数组等
    2.3、正确的JSON是这样的:属性名必须用双引号包裹

    var json = '{"name":"imooc"}'; // 这个是正确的JSON格式
     
    var json = "{"name":"imooc"}"; // 这个也是正确的JSON格式
     
    var json = '{name:"imooc"}'; // 这个是错误的JSON格式,因为属性名没有用双引号包裹
     
    var json = "{'name':'imooc'}";//这个也是错误的JSON格式,属性名用双引号包裹,而它用了单引号
     
    // 检验JSON格式是否正确,可以使用 JSON.parse(json); 如果是正确的JSON格式,会返回一个对象
    // 否则会报错
     
    // 如果是对象的话,属性名可以不用双引号包裹
     
    var obj = {name:"imooc"};
    var obj = {"name":"imooc"};
    var obj = {'name':'imooc'};
    var obj = {"name":'imooc'};
    var obj = {'name':"imooc"};
     
    // 上述写法都是正确的。一般使用第一种形式最多,有些人可能为了保证跟JSON格式的字符串保持一致性,
    // 也会使用第二种形式。。最后3种形式虽然是正确的,但不建议使用,容易挨打
    

    3、实例

     <script>
            //数组中有三个对象
            var s=[
                {"name":"TOM","age":10},
                {"name":"Jam","age":18},
                {"name":"Sally","age":15}
            ];
            //一个对象
            var x={"color":"yellow","num":10};
            //页面输出
            document.write(s[0].name)
            //控制台输出
            console.log(x.color,x.num);
    
            //对象与数组,sum对象是一个数组,数组中又有三个对象
            var l={
                "sum":[
                    {"math":100},
                    {"chinese":99},
                    {"gender":"男"}
                ]
            }
            document.write(l.sum[0].math+'
    ')
            document.write(l.sum[1].chinese)
            document.write(l.sum[2].gender)
        </script>
    

    结果

    TOM100 99男
    

    for循环的写法

    //一个对象
            var x={"color":"yellow","num":10};
             for(var k in x){
             //这里要用[]把对象扩住,x.k相当于x."color"了,与x.color不一样
                document.write(x[k])
            }
    

    二、Jackson解析器

    一、关于Jackson解析器

    1.1、常见的解析器:Jsonlib,Gson,fastjson,jackson,这些解析器都是为java语言服务的,其中Jackson是SpringMVC内置的解析器
    1.2、使用Jackson解析器需要的依赖包

    jackson-core-2.2.3.jar(核心jar包)
    
    jackson-annotations-2.2.3.jar(该包提供Json注解支持)
    
    jackson-databind-2.2.3.jar
    

    maven引入jar包

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

    二、Java转Json

    这里有个问题,maven下导入的包在实例化ObjectMapper时,显示抽象接口,而使用本地jar包导入,则没有问题,应该是maven导入的包有问题,在maven项目的类头部中把导入包名修改了就可以了

    //maven头部显示
    import io.restassured.mapper.ObjectMapper;
    //自带jar包头部显示
    import com.fasterxml.jackson.databind.ObjectMapper;
    

    类转化为JSON

    主要方法
    * writeValue(参数1,obj):
     参数1:
         File:将obj对象转换为JSON字符串,并保存到指定的文件中
         Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
        OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中
    * writeValueAsString(obj):将对象转为json字符串
    

    writeValueAsString(obj)方法

    public class JackUser {
        private String name;
        private int age;
        private String color;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getColor() {
            return color;
        }
    
        public void setColor(String color) {
            this.color = color;
        }
    }
    
    
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    
    public class Jackson {
        public static void main(String[] args) throws JsonProcessingException {
            JackUser user=new JackUser();
            user.setName("jack");
            user.setAge(20);
            user.setColor("blue");
            ObjectMapper mapper=new ObjectMapper();
            String json=mapper.writeValueAsString(user);
            System.out.println(json);
        }
    }
    
    //结果
    {"name":"jack","age":20,"color":"blue"}
    
    

    集合转化

     @Test
        public void test() throws JsonProcessingException {
            JackUser user = new JackUser();
            user.setAge(10);
            user.setColor("blue");
            user.setName("Jack");
            List<JackUser> users = new ArrayList<>();
            users.add(user);
            ObjectMapper mapper=new ObjectMapper();
            String jsonlist = mapper.writeValueAsString(users);
            System.out.println(jsonlist);
        }
        
        //结果
        [{"name":"Jack","age":10,"color":"blue"}]
    

    两者转化出来的结果有区别,一个是对象,一个是数组
    下面这个是writeValue方法

     writeValue(参数1,obj)方法
     @Test
        public void test3() throws IOException {
            JackUser user = new JackUser();
            user.setAge(10);
            user.setColor("blue");
            user.setName("Jack");
            ObjectMapper mapper=new ObjectMapper();
            //使用writeValue方法写入文件
            mapper.writeValue(new File("F:\js.json"),user);
    
        }
    

    三、JSON转Java类

    实例如下(从字符串反序列化)

    public static void main(String[] args) throws IOException {
    		 //这里的转义符号
            String json = "{"name":"小民","age":20,"color":"yellow"}";
    
            /**
             * ObjectMapper支持从byte[]、File、InputStream、字符串等数据的JSON反序列化。
             */
            ObjectMapper mapper = new ObjectMapper();
            //此处使用字符串反序列化
            JackUser user = mapper.readValue(json, JackUser.class);
            System.out.println(user.getName());
            System.out.println(user.getColor());
            System.out.println(user.getAge());
        }
        
    //结果
    小民
    yellow
    0
    

    这里使用的是readValue方法,反序列化到了我们之前创建的类JackUser的对象user里,但是age属性为什么是0呢,因为Jackson提供了一些注解,我在age的属性上加了@JsonIgnore,使得属性被忽略

    ObjectMapper支持从byte[]、File、InputStream、字符串等数据的JSON反序列化。


    实例二:从文件中反序列化

     @Test
        public void test() throws IOException {
            ObjectMapper mapper=new ObjectMapper();
            //文件中反序列化
            JackUser user=mapper.readValue(new File("F:\js.json"),JackUser.class);
            System.out.println(user.getName());
            System.out.println(user.getColor());
            System.out.println(user.getAge());
        }
        //结果
        Jack
        blue
        0
    
    

    四、注解

    Jackson提供了一系列注解,方便对JSON序列化和反序列化进行控制,下面介绍一些常用的注解。

    @JsonIgnore 此注解用于属性上,作用是进行JSON操作时忽略该属性。

    @JsonFormat 此注解用于属性上,作用是把Date类型直接转化为想要的格式,如@JsonFormat(pattern = "yyyy-MM-dd HH-mm-ss")。

    @JsonProperty 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把trueName属性序列化为name,@JsonProperty("name")。

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Salary {
    
        @JsonProperty("salary")//起别名
        public double num;
    
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss a")//格式化日期
        public Date date;
    
        @JsonIgnore//忽略掉json
        public String desc;
    }
    
     //序列化
        public void test() throws IOException {
            ObjectMapper mapper = new ObjectMapper();
            //json生成器,使用utf-8,定向到标准输出流
            JsonGenerator generator = mapper.createGenerator(System.out, JsonEncoding.UTF8);
            generator.writeObject(new Salary(5600,new Date(),"基础薪资"));
    
            //通过工厂创建,序列化到文件
            JsonGenerator jsonGenerator = mapper.getFactory().createGenerator(new FileWriter("sal.json"));
            jsonGenerator.writeObject(new Salary(5600,new Date(),"基础薪资"));
    
    
        }
    
    
    {"date":"2020-09-12 05:49:50 上午","salary":5600.0}
    

    五、节点

    Json可以像xml那样,通过节点树进行操作。

    public void test5() throws IOException {
    
            ObjectMapper mapper = new ObjectMapper();
    
            //返回整个json字符串
            JsonNode jsonNode = mapper.readTree(new File("sal.json"));
            System.out.println(jsonNode);
    
    
            //返回其中的元素
            Iterator<JsonNode> elements = jsonNode.elements();
            while (elements.hasNext()){
                JsonNode node = elements.next();
                System.out.println(node);//获取每个元素
                System.out.println(node.get("salary"));//获取元素的字段
            }
    
        }
    
    
    
  • 相关阅读:
    最全的静态网站生成器(开源项目)
    移动互联网流量变现模式调研问卷
    公众平台商户接入(微信支付)功能申请教程
    微信支付全面开放
    百度天气预报接口
    微信公众平台开发(83) 生成带参数二维码
    微信支付接口申请指南
    微信自媒体账号涉违规大规模被封
    php大文件上传解决方案支持分片断点上传
    html5大文件上传解决方案(500M以上)
  • 原文地址:https://www.cnblogs.com/cgl-dong/p/13846383.html
Copyright © 2020-2023  润新知