取得遠端相應Json並轉化為Java對象(嵌套對象)二


工程下載鏈接:https://files.cnblogs.com/files/xiandedanteng/JsonParse20190929.rar

 

客戶端

如果從Restful Service取得的Json文是嵌套的,那轉化的對象也會嵌套,用net.sf.json.JSONObject依然可以解析,但是得說明子對象的類型。

比如遠端的響應是{"name":"大明","emps":[{"id":1,"name":"傅宗龍"},{"id":2,"name":"孫傳庭"},{"id":5,"name":"盧象升"}]}

這里存在對象嵌套,需要在轉化前指定里面的{"id":1,"name":"傅宗龍"}是什么類型的。

具體代碼如下:

        // 從遠端取得相應
        RestTemplate rt=new RestTemplate();
        String result = rt.getForObject("http://localhost:8080/company",String.class);
        System.out.println(result);
        
        // 將Json字符串轉嵌套Java對象
        Map<String,Class> classMap = new HashMap<String,Class>();
        classMap.put("emps", Emp.class);//這句話是告訴JSON解析器Company類的emps中元素是什么類型的,如果不指明,emps中會是惱人的MorphDynaBean類型的。
        
        JSONObject jsonObject=JSONObject.fromObject(result);
        Company stu=(Company)JSONObject.toBean(jsonObject, Company.class,classMap);
        System.out.println(stu);

輸出是這樣:

{"name":"大明","emps":[{"id":1,"name":"傅宗龍"},{"id":2,"name":"孫傳庭"},{"id":5,"name":"盧象升"}]}
公司名=大明 雇員名:傅宗龍 雇員名:孫傳庭 雇員名:盧象升

 

第二條說明Json文字到對象的轉化是成功的。

而Emp的代碼是:

package com.testEmp;

public class Emp {

    private long id;

    private String name;
    
    public Emp() {

    }
    
    public Emp(long id,String name) {
        this.id=id;
        this.name=name;
    }

    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;
    }
}

Company的代碼是:

package com.testEmp;

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

public class Company {
    private String name;// 雇員列表

    private List<Emp> emps;// 公司名稱
    
    // 因為反射生成實例的緣故,這個空構造函數是必須的
    public Company() {
    }
    
    public Company(String name) {
        this.name=name;
        emps=new ArrayList<Emp>();
    }
    
    // 這種寫法能做到連加
    public Company add(Emp newEmployee){
        emps.add(newEmployee);
        return this;
    }
    
    public String toString() {
        StringBuilder sb=new StringBuilder();
        
        sb.append("公司名="+this.name);
        
        for(Emp e:emps) {
            sb.append(" 雇員名:"+e.getName());
        }
        
        return sb.toString();
    }
    
    public String getName() {
        return name;
    }

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

    public List<Emp> getEmps() {
        return emps;
    }

    public void setEmps(List<Emp> emps) {
        this.emps = emps;
    }
}

 

服務端

控制器:

package com.example.demo;

import java.util.Optional;

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

@RestController
public class Ctrl {
。。。
    
    @RequestMapping("/company")
    public Company getCompany() {
        Company c=new Company("大明");
        
        c.add(new Emp(1,"傅宗龍")).add(new Emp(2,"孫傳庭")).add(new Emp(5,"盧象升"));
        
        return c;
    }
}

Company類:

package com.example.demo;

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

public class Company {
    private String name;// 雇員列表

    private List<Emp> emps;// 公司名稱
    
    public Company(String name) {
        this.name=name;
        emps=new ArrayList<Emp>();
    }
    
    // 這種寫法能做到連加
    public Company add(Emp newEmployee){
        emps.add(newEmployee);
        return this;
    }
    
    public String getName() {
        return name;
    }

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

    public List<Emp> getEmps() {
        return emps;
    }

    public void setEmps(List<Emp> emps) {
        this.emps = emps;
    }
}

Emp類:

package com.example.demo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Emp {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;
    
    @Column
    private String name;
    
    public Emp() {

    }
    
    public Emp(long id,String name) {
        this.id=id;
        this.name=name;
    }

    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;
    }
}

 

 

參考資料:https://blog.csdn.net/fenfenguai/article/details/78614788

--END-- 2019年9月29日14:31:43

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM