工程下載鏈接: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