30.JSON生产和解析

1.什么是json

JSON(JavaScript  Object  Notation, JS 对象简谱) 采用完全独立于编程语言的用文本格式来存储和表示数据的轻量级的数据交换格式

2.如何编写json

      json是由2个元素组成。

(1)第一个元素,json对象

格式:{名称:数据值,名称:数据值,…}

            -------名称:数据值——键值对

            键值对中的键要有” ”,键值对中的值字符串和时间日期型的数据需要“ ”

例:

public  class  Student{

      private  int stuid;

      private  String stuname;

      private  int stuage;

      private  String stuaddress;

      getXXX()/setXXX() 

   }

   Student  stu1=new Student();

   stu1.setStuid(1001);

   stu1.setStuname("zhangsan");

   stu1.setStuage(23);

   stu1.setStuaddress("西安");

转换成json对象:

{"stuid":1001,"stuname":"zhangsan","stuage":23,"stuaddress":"西安"}

(2)第二个元素,json数组

   格式:[具体的数据值/json对象]

例:

public  class  Student{

      private  int stuid;

      private  String stuname;

      private  int stuage;

      private  String stuaddress;

      getXXX()/setXXX() 

   }

   Student  stu1=new Student();

   stu1.setStuid(1001);

   stu1.setStuname("zhangsan");

   stu1.setStuage(23);

   stu1.setStuaddress("西安");

   Student  stu2=new Student();

   stu2.setStuid(1002);

   stu2.setStuname("lisi");

   stu2.setStuage(24);

   stu2.setStuaddress("北京");

   Student  stu3=new Student();

   stu3.setStuid(1003);

   stu3.setStuname("wangwu");

   stu3.setStuage(25);

   stu3.setStuaddress("上海");

   List<Student> studentlist=new ArrayList<Student>();

   studentlist.add(stu1);

   studentlist.add(stu2);

   studentlist.add(stu3);

将java集合转换成json数组以后的结果:

json数组:

[

{"stuid":1001,"stuname":"zhangsan","stuage":23,"stuaddress":"西安"},

{"stuid":1002,"stuname":"lisi","stuage":24,"stuaddress":"北京"},

{"stuid":1003,"stuname":"wangwu","stuage":25,"stuaddress":"上海"}

]

将java数组转换成json数组以后的结果:

java数组:String  names[]={"zhangsan","lisi","wangwu"};

json数组:["zhangsan","lisi","wangwu"]

总结

我们以后所面临的json数据都是相互嵌套的,json数组中有json对象,json对象中有json数组。当我们得到一个极其复杂的json数据后,搞不清楚这个json数据的结构。

      我们可以利用工具【https://www.json.cn/】得到明晰的json数据的结构

json数据都是相互嵌套,例如:

public class Student {

   private  int stuid;

   private  String stuname;

   private  int stuage;

   private  MyAddress myAddress[];

  

   public int getStuid() {

      return stuid;

   }

   public void setStuid(int stuid) {

      this.stuid = stuid;

   }

   public String getStuname() {

      return stuname;

   }

   public void setStuname(String stuname) {

      this.stuname = stuname;

   }

   public int getStuage() {

      return stuage;

   }

   public void setStuage(int stuage) {

      this.stuage = stuage;

   }

   public MyAddress[] getMyAddress() {

      return myAddress;

   }

   public void setMyAddress(MyAddress[] myAddress) {

      this.myAddress = myAddress;

   }

}





public class MyAddress {

   private String type;

   private String info;

  

  

   public String getType() {

      return type;

   }

   public void setType(String type) {

      this.type = type;

   }

   public String getInfo() {

      return info;

   }

   public void setInfo(String info) {

      this.info = info;

   }

}





import java.util.ArrayList;

import java.util.List;



public class Main {



   public static void main(String[] args) {



      Student  stu1=new Student();

      stu1.setStuid(1001);

      stu1.setStuname("zhangsan");

      stu1.setStuage(23);

      MyAddress address1=new MyAddress();

      address1.setType("工作");

      address1.setInfo("锦业1路");

      MyAddress address2=new MyAddress();

      address2.setType("家庭");

      address2.setInfo("高新4路");

      MyAddress  myAddressArray1[]={address1,address2};

      stu1.setMyAddress(myAddressArray1);



     

      Student  stu2=new Student();

      stu2.setStuid(1002);

      stu2.setStuname("lisi");

      stu2.setStuage(24);

      MyAddress address21=new MyAddress();

      address21.setType("工作");

      address21.setInfo("自强1路");

      MyAddress address22=new MyAddress();

      address22.setType("家庭");

      address22.setInfo("团结4路");

      MyAddress  myAddressArray2[]={address21,address22};

      stu2.setMyAddress(myAddressArray2);

     

      List<Student> studentlist=new ArrayList<Student>();

      studentlist.add(stu1);

      studentlist.add(stu2);

   }

}

转换成json数据

[

 {"stuid":1001, "stuname":"zhangsan","stuage":23,

"stuaddress":[{"type":"工作","info":"锦业1"},

{"type":"家庭","info":"高新4"}

]

 },

 {"stuid":1002,"stuname":"lisi","stuage":24,

      "stuaddress":[{"type":"工作","info":"自强1"},

                    {"type":"家庭","info":"团结4"}

                  ]

}

]

3.json数据的生成

3.1 JSON-simple-1.1.jar第三方的开发包生成json数据

import java.util.List;



import org.json.simple.JSONArray;

import org.json.simple.JSONObject;



public class JSONHelper {



   /**

    * JSON -simple-1.1.jar第三方的开发包生成json数据

    *

    */

   public static String createjson1(List<Student> studentlist) {

      //创建studentlist对应的json数组

      JSONArray studentjsonarray = new JSONArray();

      //循环遍历studentlist

      for(Student student:studentlist){

          //创建student对应的json对象

          JSONObject jsonObject = new JSONObject();

          jsonObject.put("stuid", student.getStuid());

          jsonObject.put("stuname",student.getStuname());

          jsonObject.put("stuage", student.getStuage());

          //创建保存地址的json数组

          JSONArray addressjsonArray = new JSONArray();

          MyAddress[] myAddress = student.getMyAddress();

             //遍历地址数组

             for(MyAddress address:myAddress){

                //创建address对应的json对象

                JSONObject addressjsonObject = new JSONObject();

                addressjsonObject.put("type", address.getType());

                addressjsonObject.put("info", address.getInfo());

                //地址对象放到地址数组

                addressjsonArray.add(addressjsonObject);

             }

          //地址json数组放到student的json对象

          jsonObject.put("stuaddress", addressjsonArray);

          studentjsonarray.add(jsonObject);

      }

      String str = studentjsonarray.toString();

      return str;

  

   }



}

主方法:

//生成json数据

      String createjson1 = JSONHelper.createjson1(studentlist);

      System.out.println(createjson1);

输出为:

[{"stuaddress":[{"type":"工作","info":"锦业1"},{"type":"家庭","info":"高新4"}],"stuid":1001,"stuname":"zhangsan","stuage":23},{"stuaddress":[{"type":"工作","info":"自强1"},{"type":"家庭","info":"团结4"}],"stuid":1002,"stuname":"lisi","stuage":24}]

利用网站转换看看结构:

 

3.2 Gson-2.8.0.jar第三方的开发包生成json数据

/**

    * Gson-2.8.0.jar第三方的开发包生成json数据

    *

    */

   public static String createjson2(List<Student> studentlist) {

      Gson gson = new Gson();

      String json = gson.toJson(studentlist);

      return json;

   }

输出:

[{"stuid":1001,"stuname":"zhangsan","stuage":23,"myAddress":[{"type":"工作","info":"锦业1"},{"type":"家庭","info":"高新4"}]},{"stuid":1002,"stuname":"lisi","stuage":24,"myAddress":[{"type":"工作","info":"自强1"},{"type":"家庭","info":"团结4"}]}]

 

3.3 jackson第三方的开发包生成json数据

  

/**

    * jackson第三方的开发包生成json数据

    *

    */

   public static String createjson3(List<Student> studentlist) {

      ObjectMapper objectMapper = new ObjectMapper();

      String jsonstring="[]";

      try {

          jsonstring = objectMapper.writeValueAsString(studentlist);

      } catch (JsonProcessingException e) {

          e.printStackTrace();

      }

      return jsonstring;

   }

输出:

[{"stuid":1001,"stuname":"zhangsan","stuage":23,"myAddress":[{"type":"工作","info":"锦业1"},{"type":"家庭","info":"高新4"}]},{"stuid":1002,"stuname":"lisi","stuage":24,"myAddress":[{"type":"工作","info":"自强1"},{"type":"家庭","info":"团结4"}]}]

3.4 拼接字符串生成json数据

      不推荐使用,因为“”特别任意出错

/**

    * 拼接字符串

    */

  

   public static String createjson4(List<Student> studentlist) {

      StringBuilder stringBuilder=new StringBuilder();

      stringBuilder.append("[");

      for(Student student:studentlist){

          stringBuilder.append("{");

         stringBuilder.append("\"stuid\":"+student.getStuid()+",");

      stringBuilder.append("\"stuname\":\""+student.getStuid()+"\",");

         stringBuilder.append("\"stuage\":"+student.getStuid()+",");

          stringBuilder.append("\"stuaress\":[");

          MyAddress  myaddress[]=student.getMyAddress();

          for(MyAddress address:myaddress){

             stringBuilder.append("{");

             stringBuilder.append("\"type\":\""+address.getType()+"\",");

             stringBuilder.append("\"info\":\""+address.getInfo()+"\"");

             stringBuilder.append("},");

          }

         stringBuilder.deleteCharAt(stringBuilder.lastIndexOf(","));

          stringBuilder.append("]");

          stringBuilder.append("},");

      }

      stringBuilder.deleteCharAt(stringBuilder.lastIndexOf(","));

      stringBuilder.append("]");

      String string = stringBuilder.toString();

      return string;

   }

4.解析json

4.1 json-simple-1.1.jar第三方的开发包解析json数据

import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;

import java.util.ArrayList;

import java.util.List;

import org.json.simple.JSONArray;

import org.json.simple.JSONObject;

import org.json.simple.parser.JSONParser;



public class JSONHelper {

   public static List<Student> getStudentlist1(String filename) throws Exception {

      List<Student> studentlist = new ArrayList();

      try {

          // 读取数据

          BufferedReader in = new BufferedReader(new FileReader(new File(filename)));

          String jsonstring = in.readLine();

          in.close();

          // 开始解析

          // 创建解析器

          JSONParser jsonParser = new JSONParser();

          // 得到json数组

          JSONArray studentlistArray = (JSONArray) jsonParser.parse(jsonstring);

          // 普通for循环遍历

          for (int i = 0; i < studentlistArray.size(); i++) {

             Student student = new Student();

             // 得到json对象

             JSONObject studentjsonObject = (JSONObject) studentlistArray.get(i);

             long id = (Long) studentjsonObject.get("stuid");

             int stuid=(int)id;//必须先转为long,在转int

             student.setStuid(stuid);

             String stuname = (String) studentjsonObject.get("stuname");

             student.setStuname(stuname);

             long age = (Long) studentjsonObject.get("stuage");

             int stuage=(int)age;

             student.setStuage(stuage);

             // 得地址json数组

             JSONArray addressJSONArray = (JSONArray) studentjsonObject.get("myAddress");

             // 遍历json数组

             MyAddress myaddressarray[] = new MyAddress[addressJSONArray.size()];

             for (int j = 0; j < addressJSONArray.size(); j++) {

                MyAddress myAddress = new MyAddress();

                JSONObject addressJSONObject = (JSONObject) addressJSONArray.get(j);

                String type = (String) addressJSONObject.get("type");

                myAddress.setType(type);

                String info = (String) addressJSONObject.get("info");

                myAddress.setInfo(info);

                myaddressarray[j] = myAddress;

             }

             student.setMyAddress(myaddressarray);

             studentlist.add(student);

          }

      } catch (Exception e) {

          e.printStackTrace();

      }

      return studentlist;

   }

}

测试类:

public class Main {



   public static void main(String[] args) throws Exception {

      List<Student> studentlist1=JSONHelper.getStudentlist1("student.json");

      //遍历测试一下

      for(Student stu:studentlist1){

      System.out.println(stu.getStuname()+"\t"+stu.getMyAddress()[0].getInfo());

      }

   }

}

输出:

zhangsan  锦业1

lisi  自强1

4.2 gson-2.8.0.jar第三方的开发包解析json数据

import com.google.gson.Gson;

import com.google.gson.JsonIOException;

import com.google.gson.JsonSyntaxException;

import com.google.gson.reflect.TypeToken;

   /**

    *gson-2.8.0.jar第三方的开发包解析json数据

    *

    */

   public static List<Student> getStudentlist2(String filename) throws Exception {

      Gson gson = new Gson();

      Type type=new TypeToken<List<Student>>(){}.getType();   

      return gson.fromJson(new FileReader(filename), type);

   }

4.3 jackson第三方的开发包解析json数据

   /**

    * jackson第三方的开发包解析json数据

    */

  

   public static List<Student> getStudentlist3(String filename) throws Exception {

      List<Student> studentlist = new ArrayList();

     

      ObjectMapper objectMapper = new ObjectMapper();

      JsonNode studentlistarray = objectMapper.readTree(new File(filename));

      for(int i=0;i<studentlistarray.size();i++){

          Student student=new Student();

          JsonNode studentObject = studentlistarray.get(i);

          int stuid = studentObject.get("stuid").asInt();

          student.setStuid(stuid);

          String stuname = studentObject.get("stuname").asText();

          student.setStuname(stuname);

          int stuage = studentObject.get("stuage").asInt();

          student.setStuage(stuage);

          JsonNode addressarray = studentObject.get("myAddress");

          MyAddress address[]=new MyAddress[addressarray.size()];

          for(int j=0;j<addressarray.size();j++){

             MyAddress myaddress=new MyAddress();

             JsonNode addressobj = addressarray.get(j);

             String type = addressobj.get("type").asText();

             String info = addressobj.get("info").asText();

             myaddress.setType(type);

             myaddress.setInfo(info);

             address[j]=myaddress;

          }

          student.setMyAddress(address);

          studentlist.add(student);

      } 

      return studentlist;

   }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java-请多指教

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值