【SpringBoot】JSon串的提供、获取和解读

【提供部分】

说明:SpringBoot程序要提供Json串供外界访问,只需要@RestController标签即可,具体代码如下:

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.hy.mybank.Entity.Clazz;
import com.hy.mybank.Entity.Student;


@RestController
public class JsonController {
......
    
    @GetMapping("/fetchJson")
    public Map<String,Object> fetchJson() {
        Map<String,Object> retvalMap=new LinkedHashMap<String,Object>();
        
        Clazz cls=new Clazz(1,"大一");
        cls.addStudents(new Student(1,"刘德华"));
        cls.addStudents(new Student(2,"郭富城"));
        cls.addStudents(new Student(3,"张学友"));
        cls.addStudents(new Student(4,"黎明"));
        
        retvalMap.put("status", true);
        retvalMap.put("class", cls);
        
        return retvalMap;
    }
......
}

以上程序用到的clazz类和student类:

package com.hy.mybank.Entity;

import java.util.ArrayList;
import java.util.List;

public class Clazz {
    private long id;
    private String name;
    private List<Student> students;
    
    public Clazz(long id,String name) {
        this.id=id;
        this.name=name;
    }
    
    public void addStudents(Student stu) {
        if(students==null) {
            students=new ArrayList<Student>();
        }
        
        students.add(stu);
    }
    
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Student> getStudents() {
        return students;
    }

    public void setStudents(List<Student> students) {
        this.students = students;
    }
}
package com.hy.mybank.Entity;

/**
 * 和Test表对应的实体类
 * @author ufo
 *
 */
public class Student {
    private int id;
    private String name;
    
    public Student(int id,String name) {
        this.id=id;
        this.name=name;
    }
    
    public Student() {
        this(-1,"unidentified");
    }
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

之后,在浏览器中输入:http://localhost:8080/fetchJson

以下Json串就会出现:

{"status":true,"class":{"id":1,"name":"大一","students":[{"id":1,"name":"刘德华"},{"id":2,"name":"郭富城"},{"id":3,"name":"张学友"},{"id":4,"name":"黎明"}]}}

 

【获取部分】

要用Java程序获取位于http://localhost:8080/fetchJson的rest服务内容,只需要RestTemplate的帮助,具体如下:

        RestTemplate rt=new RestTemplate();
        String json = rt.getForObject("http://localhost:8080/fetchJson",String.class);

下面打印的就是获取到的json内容,和上面返回的json一致。

{"status":true,"class":{"id":1,"name":"大一","students":[{"id":1,"name":"刘德华"},{"id":2,"name":"郭富城"},{"id":3,"name":"张学友"},{"id":4,"name":"黎明"}]}}

赘述一下RestTemplate无需另引入依赖,它本身就是SpringBoot程序的一部分。

 

【解读部分】

解读用SpringBoot自带的ObjectMapper就行了,和RestTemplate一样,它也是SpringBoot程序的一部分。

解读json串各节点的代码如下:

package com.hy.mybank;

import java.util.Iterator;

import org.springframework.web.client.RestTemplate;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class ReadJsonTest {
    public static void main(String[] args) throws Exception{
        RestTemplate rt=new RestTemplate();
        String json = rt.getForObject("http://localhost:8080/fetchJson",String.class);
        
        ObjectMapper mapper = new ObjectMapper();
        // 获取根节点
        JsonNode node = mapper.readTree(json);
        
        // 找根节点下class节点里的students节点组
        JsonNode listNode=node.get("class").path("students");
        
        Iterator<JsonNode> iterator = listNode.elements();
        while (iterator.hasNext()) {
            JsonNode student = iterator.next();
            // 获取节点文本
            String name=student.get("name").asText();
            System.out.println(name);
        }
    }
}

输出的结果是:

刘德华
郭富城
张学友
黎明

大家可以拿程序、结果和Rest服务提供的字串比对一下,相信很快就能领会解读程序的写法。

 

END

 

posted @ 2022-02-15 03:23  逆火狂飙  阅读(591)  评论(0编辑  收藏  举报
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东