取得远端相应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

 

posted @   逆火狂飙  阅读(1825)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2017-09-29 【Canvas与化学】铀元素图标
2017-09-29 Sql中存在斜杠“/”怎么办?
2017-09-29 JSONObject和JSONArray(json-lib-2.4)的基本用法
2017-09-29 如何设定linux系统时间
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示