目标
- 示例的编程语言为 java。
- json 数据格式的产生就像套娃一样,前几层保证的是内容,只有最后一层才决定你的数据结构。
- 以下面的三个例子作为实现方式。
- 充分利用 java 的继承特性来达到代码的简洁优雅书写。
json 数据格式简介
- json 数据均以 key:value 形式进行存储,且用逗号来分隔。
- json 数据的{}中均是一个对象。
- json 数据中[]里面的数据可以存储一个列表,也就是可以存储多个对象。
例如以下几种 json 数据
// 1.在web传输中基本的数据格式
{
"status":200,
"msg":"ok",
"data":"this is json data"
}
// 2.传输带有对象的json数据
{
"status":200,
"msg":"ok",
"data": {
"name":"zhangsan",
"age":11,
"sex":"man"
}
}
// 3.传输带有列表的json数据
{
"payment":5288,
"postFee":0,
"userId":"3",
"buyerMessage":null,
"buyerNick":"zhang123",
"orderItems":[
// 这是第一个列表的第一个对象
{
"itemId":"9",
"num":1,
"title":"苹果111111111111111111111",
"price":5288,
"totaFee":5200,
"picPath":"asdasdsadsadasdasdasd"
},
// 这是第一个列表的第二个对象
{
"itemId":"10",
"num":2,
"title":"苹果22222",
"price":5300,
"totaFee":5200,
"picPath":"https://adasdasdasd"
}
],
// 这是列表外的第二个对象
"orderShipping":{
"receiverName":"张三",
"receiverPhone":"1321231",
"receiverMobile":"150000000",
"receiverState":"上海",
"receiverCity":"上海",
"receiverDistrict":"三生三世",
"receiverAddress":"少时诵诗书所",
"receiverZip":"20000"
}
}
准备工作
创建一个 map 用来格式化最外层的 json 数据
使用了 jackson 啦产生 json 数据(如果是 web 项目只需要使用注解即可实现)
/**
* 产生json数据的
* JsonMap
*/
public class JsonMap {
public static Map<String, Object> createJsonMap(final int status, final String msg, final Object data) {
final Map<String, Object> map = new LinkedHashMap<String, Object>();
ObjectMapper objectMapper = new ObjectMapper();
map.put("status", status);
map.put("message", msg);
map.put("data", data);
try {
String json = objectMapper.writeValueAsString(map);
return json;
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return "";
}
public static void main(final String[] args) {
String json = createJsonMap(200, "ok", "yes");
System.out.println(json);
}
}
输出效果为
{
"message": "ok",
"status": 200,
"data": "yes"
}
创建三个 pojo 类用来模拟传输的数据
三个 pojo 仅仅是最后一个属性不同
Tea 的为 hobby,Stu 为 addr,fam 为 sex
下面仅列举其中之一
/**
* 一个名字叫做fam的pojo类
* @author Shown
*
*/
public class Pojofam {
private String name;
private int age;
private String sex;
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 getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
向 json 中添加 1 个对象
public static void main(final String[] args) {
// 创建一个pojo并且设置属性
Pojofam pojofam = new Pojofam();
pojofam.setName("zhangsan");
pojofam.setAge(15);
pojofam.setSex("man");
String json = createJsonMap(200, "ok", pojofam);
System.out.println(json);
}
输出结果为
{
"status": 200,
"message": "ok",
"data": {
"name": "zhangsan",
"age": 15,
"sex": "man"
}
}
如果要想在对象中添加属性,但是不能直接在文件中加入,可以使用继承的方式(建议不要在项目开发到一半的时候去改动已经使用过的公共 pojo 一类的文件)
举例说明,在 pojofam 这个对象上在加入一个 date 属性的话
- 新建 pojo 类继承 pojofam 类
/**
* 一个名字叫做famSon的fam类的子类
* @author Shown
*
*/
public class PojofamSon extends Pojofam{
private String date;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
- 创建对象并赋值
/**
* 一个名字叫做famSon的fam类的子类
* @author Shown
*
*/
public class PojofamSon extends Pojofam{
private String date;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
运行结果
@Test
public void pojoSonTest() {
PojofamSon pojofamSon = new PojofamSon();
pojofamSon.setName("lisi");
pojofamSon.setAge(22);
pojofamSon.setSex("women");
Date date = new Date();
String strDateFormat = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(strDateFormat);
pojofamSon.setDate(sdf.format(date));
String json = JsonMap.createJsonMap(200, "ok", pojofamSon);
System.out.println(json);
}
下面进行 json 中的属性加入多对象的操作
- 理清数据结构的类型
- 创建出刚好合适的 pojo
- 如果发现需要的 pojo 没有相应的属性,需要再次添加,请参照如上方法
输出多个不同的对象
- 创建 pojo,使对象作为属性
/**
* 一个名字叫做PojoObj的pojo类,里面包括了3个pojo对象
*
* @author Shown
*
*/
public class PojoObj {
private PojoStu pojoStu;
private PojoTea pojoTea;
private Pojofam pojofam;
public PojoStu getPojoStu() {
return pojoStu;
}
public void setPojoStu(PojoStu pojoStu) {
this.pojoStu = pojoStu;
}
public PojoTea getPojoTea() {
return pojoTea;
}
public void setPojoTea(PojoTea pojoTea) {
this.pojoTea = pojoTea;
}
public Pojofam getPojofam() {
return pojofam;
}
public void setPojofam(Pojofam pojofam) {
this.pojofam = pojofam;
}
}
运行测试
@Test
public void pojoObjTest() {
// 创建三个对象实例
PojoStu pojoStu = new PojoStu();
pojoStu.setName("zhangsan");
PojoTea pojoTea = new PojoTea();
pojoTea.setName("wangwu");
Pojofam pojofam = new Pojofam();
pojofam.setName("lisi");
// 创建集合类实例
PojoObj ppObj = new PojoObj();
ppObj.setPojoStu(pojoStu);
ppObj.setPojoTea(pojoTea);
ppObj.setPojofam(pojofam);
String json = JsonMap.createJsonMap(200, "ok", ppObj);
System.out.println(json);
}
输出结果
{
"status": 200,
"message": "ok",
"data": {
"pojoStu": {
"name": "zhangsan",
"age": 0,
"sex": null
},
"pojoTea": {
"name": "wangwu",
"age": 0,
"sex": null
},
"pojofam": {
"name": "lisi",
"age": 0,
"sex": null
}
}
}
列表封装 pojo,实现 json 输出列表
/**
* 一个名字叫做PojoObjList的pojo类,里面包括了2个pojo对象和一个列表对象
*
* @author Shown
*
*/
public class PojoObjlist {
private PojoStu pojoStu;
private PojoTea pojoTea;
private List<Pojofam> pojofam;
public PojoStu getPojoStu() {
return pojoStu;
}
public void setPojoStu(PojoStu pojoStu) {
this.pojoStu = pojoStu;
}
public PojoTea getPojoTea() {
return pojoTea;
}
public void setPojoTea(PojoTea pojoTea) {
this.pojoTea = pojoTea;
}
public List<Pojofam> getPojofam() {
return pojofam;
}
public void setPojofam(List<Pojofam> pojofam) {
this.pojofam = pojofam;
}
}
运行测试
@Test
public void pojoObjListTest() {
// 创建两个对象实例
PojoStu pojoStu = new PojoStu();
pojoStu.setName("zhangsan");
PojoTea pojoTea = new PojoTea();
pojoTea.setName("wangwu");
// 创建一个存放pojo列表
List<Pojofam> pojofams = new ArrayList<Pojofam>();
Pojofam pojofam = new Pojofam();
pojofam.setName("lisi");
Pojofam pojofam2 = new Pojofam();
pojofam.setName("lisi2");
pojofams.add(pojofam);
pojofams.add(pojofam2);
// 创建结构化pojo
PojoObjlist poboObjlist = new PojoObjlist();
poboObjlist.setPojofam(pojofams);
poboObjlist.setPojoStu(pojoStu);
poboObjlist.setPojoTea(pojoTea);
String json = JsonMap.createJsonMap(200, "ok", poboObjlist);
System.out.println(json);
}
测试结果
{
"status": 200,
"message": "ok",
"data": {
"pojoStu": {
"name": "zhangsan",
"age": 0,
"sex": null
},
"pojoTea": {
"name": "wangwu",
"age": 0,
"sex": null
},
"pojofam": [
{
"name": "lisi2",
"age": 0,
"sex": null
},
{
"name": null,
"age": 0,
"sex": null
}
]
}
}