目标

  • 示例的编程语言为 java。
  • json 数据格式的产生就像套娃一样,前几层保证的是内容,只有最后一层才决定你的数据结构。
  • 以下面的三个例子作为实现方式。
  • 充分利用 java 的继承特性来达到代码的简洁优雅书写。

json 数据格式简介

  1. json 数据均以 key:value 形式进行存储,且用逗号来分隔。
  2. json 数据的{}中均是一个对象。
  3. 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 属性的话

  1. 新建 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;
    }

}
  1. 创建对象并赋值
/**
 * 一个名字叫做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 中的属性加入多对象的操作

  1. 理清数据结构的类型
  2. 创建出刚好合适的 pojo
  3. 如果发现需要的 pojo 没有相应的属性,需要再次添加,请参照如上方法

输出多个不同的对象

  1. 创建 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
      }
    ]
  }
}

总结:以上方法均可交叉使用,最后看的只是套娃 pojo 的最后一层,决定了你的 json 数据结构和显示方式。