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+'\n')
        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"));//获取元素的字段
        }

    }


posted @ 2020-10-20 14:40  cgl_dong  阅读(118)  评论(0编辑  收藏  举报