小东吖 之 java JSON解析

一.JSON简介

AVAScript Object Notation是一种轻量级的数据交换格式
具有良好的可读和便于快速编写的特性。
业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持)
JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 – Json.org
JSON作为数据是目前网络中主流的数据传输格式之一,应用十分广泛,说是使用率达到99%一点也不勉强

二.JSON语法

JSON 语法
作用: JSON文本是类似XML文本文件,用来储存和传输数据信息的的媒介
注: JSON同XML一样,不仅可以通过响应文件作为数据的载体,也可以通过满足语法字符串作为对应数据的载体 称之为 “json字符串”

json数据存储采用{}与[]语法
{} => java中的双列集合 (字典)
[] => java中的单列集合 (数组)

  1. json语法最顶层为 单一{} 或 单一[]
  2. json语法中结构为 {} [] 相互嵌套({}可以嵌套{}[],[]也可以相互嵌套{}[])
  3. json语法中以逗号(,)作为字段分割的标识(注: 最后一个字段不能添加逗号)
  4. 字典中语法为 {“key”:value}格式 (注: key为字符串)
    多条语句语法:
    {
    “key1”: value1,
    “key2”: value2,
    … : … ,
    “keyn”: valuen
    }
  5. 数组中语法为[value1,value2,value3] 格式(注: value拥有类型)

    1. 数字(整数或浮点数)
    2. 逻辑值(true 或 false)
    3. 字符串(在双引号中)
    4. 数组(在方括号中)
    5. 函数
    6. 对象(在大括号中)
    7. null
  6. {}和[]中的每一个value均可以为{}|[] ,且多个value类型不一定相同

7.我们在JSON解析中只有三中情况出现
1.{} 解析’大括号’类型
2. [ ] 解析是’中括号’类型
3. 其实只有两种,那第三种则是1与2的组合方法即”{”name”:”小东吖”,”hobby”:[“编程”,”电竞”,”睡觉”]}”那么下面分别来看一些这三种类型以及解析

三.解析JSON

SON解析一定要掌握的两条规则:

1.如果看到是{ }–>使用JSONObject
2.如果看到的[ ]–>使用JSONArray解析

掌握了JSON的数据类型和基本语法后,我们对JSON的各种语法类型进行详细解析(注意掌握两条规则的使用,掌握了JSON解析就那么回事)

我们在eclipse里面操作JSON解析的时候需要第三方jar包的支持 (可以从网上下载)

        // JSON字符串以{}包裹,解析为JSONObject对象
        // JSON字符串以[]包裹,解析为JSONArray对象

        // 纯数组解析
    public static void main(String[] args) {
        String string = "[\"天津\",\"上海\",\"北京\",\"南京\"]";
        // []是数组 将其解析为JSONArray数组即可 拥有数组的方法
        JSONArray jsonArray = JSON.parseArray(string);
        System.out.println(jsonArray);

        // 纯对象解析
        String oString = "{\"name\" : \"小东吖\" }";
        // 大括号是对象类型的 解析为JSONObject类型即可
        JSONObject jsonObject = JSON.parseObject(oString);
        // parseObject的参数(字符串,类名.class); 就可解析为对象
        Student student = jsonObject.parseObject(oString, Student.class);
        System.out.println(student);

Student类 通过setter getter 方法去匹配属性

public class Student {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // toString方法用于控制台输出  
    @Override
    public String toString() {
        return "Student [name=" + name + "]";
    }

三.综合性解析

  1. 先写一个JSON文件
{
    "states":0,
    "msg":"蓝鸥剑桥学院",
    "data":
    [
            {
                "tag": "Teachers",
                "data": 
                [
                    {
                        "name": "王大锤",
                        "gender": "男",
                        "subject": "尬艺术",
                        "salary": 800
                    },
                    {
                        "name": "苍肖峰",
                        "gender": "女",
                        "subject": "体艺术",
                        "salary": 2000
                    },
                    {
                        "name": "马小璐",
                        "gender": "未知",
                        "subject": "媚艺术",
                        "salary": 0
                    }
                ]
            },
            {
                "tag": "Students",
                "data": 
                [
                    {
                        "name": "胡一彪",
                        "gender": "男",
                        "age": 18,
                        "class": "三班"
                    },
                    {
                        "name": "刘宝宝",
                        "gender": "男",
                        "age": 8,
                        "class": "八班"
                    },
                    {
                        "name": "王思思",
                        "gender": "女",
                        "age": 16,
                        "class": "四班"
                    },
                    {
                        "name": "雷布斯",
                        "gender": "女",
                        "age": 10,
                        "class": "五班"
                    }
                ] 
            }
    ]
}
  1. 解析 明确一点解析的结果为对象 需要创建一个School类
  2. 一:第一层 (JSONObject){”status”: “msg”: “data”}
    二:第二层 (JSONArray) []
    三:第三层 (JSONObject) {} 里面包含”Teachers” “Students” 里面嵌套的都是(JSONObject){}
    这就需要咱们在解析的时候需要很细致的去创建对应的属性值,JSON解析并不难,而难受的地方就提现在对类的创建中,只要够细心也超简单!

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import lesson.ls01.JSONs;

// 功能: 对外提供一个公用的JSON解析结果
// 定义单例的原因: 公用--封装 | 单一 -- 单例
public class AnalyisisJSON {
    // 对外提供单一对象
    private static Map<String,List<Object>> school = null;
    // 对外提供的对象和自身没关系
    // 不对外提供构造器 且自身构造器不需要做任何操作
    private AnalyisisJSON() {}

    public static Map<String,List<Object>> jsonToMap() {
        // 单例对外提供的单例方法 作为一对象赋值
        // 唯一对象为school对应的map 赋值的操作为JSON数据的解析
        System.out.println("开始获取数据!!!");
        if (school == null) {
            school = analyse();
        }
        return school;
    }
    // 解析方法
    public static Map<String,List<Object>> analyse() {
        // 单例 延迟测试单例
        long timeMillis = System.currentTimeMillis();
        while (System.currentTimeMillis()-timeMillis <2000) {}

        Map<String,List<Object>> map = new HashMap<>();
        String jStr = JSONs.jsonString("src/lesson/ls02/School.json");
        // 第一层
        JSONObject jsonObject = JSON.parseObject(jStr);
        // 第二层
        JSONArray jsonArray = jsonObject.getJSONArray("data");
        // 第三层  分Teachers | Students
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject jObject = jsonArray.getJSONObject(i);
            // 第四层 Teacher-数组 | Students-数组 
            JSONArray jArray = jObject.getJSONArray("data");

            String tag = jObject.getString("tag");
            // 第五层 整体解析为 List
            if (tag.equals("Teachers")) {
                List<Teacher> ts = JSON.parseArray(jArray.toJSONString(), Teacher.class);
                // 向上转型 把teacher类转为object
                List<Object> os = new ArrayList<>(ts);
                map.put(tag, os);
            }
            if (jObject.getString("tag").equals("Students")) {
                List<Student> ss = JSON.parseArray(jArray.toJSONString(), Student.class);
                List<Object> os = new ArrayList<>(ss);
                map.put(tag, os);
            }
        }


        return map;
    }

}
// 这里我将JSON文件转为字符串的方法封装起来
public class JSONs {
       // 解析JSON文件转换成JSON字符串
        // 分析: BufferedReader-行读取文本内容
        // StringBuffer将读取的内容一次次拼接
        // 将最终的字符串为结果返回
    // 功能: 将JSON文件转化为JSON字符串,采用 注解 方式解决
    public static String jsonString(String filePath){
        StringBuffer sb = new StringBuffer();
        File file = new File(filePath);
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(file));
            String line = "";
            while ((line = reader.readLine()) != null) { // 读完是空的
                sb.append(line.trim());
            }

        } catch (Exception e) {
            System.out.println("json字符串解析失败 -- " + e.getMessage());
        } finally {
                try {
                    if (reader != null)
                    reader.close();
                } catch (IOException e) {
                    System.out.println("流关闭失败 -- "+ e.getMessage());
                }
        }
        // 构造器将StringBuffer转为字符串 返回
        return new String(sb);
    }
}


public class Test {
    public static void main(String[] args) {
        Map<String,List<Object>> school = AnalyisisJSON.jsonToMap();
        System.out.println("school: " + school);
   }
}
Student类
import com.alibaba.fastjson.annotation.JSONField;

public class Student {
    private String name;
    private String gender;
    private int age;
    // 注解
    @JSONField(name = "class")
    private String clazz;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    public String getClazz() {
        return clazz;
    }
    public void setClazz(String clazz) {
        this.clazz = clazz;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", gender=" + gender + ", age=" + age + ", clazz=" + clazz + "]";
    }

}
Teacher类
public class Teacher {
    private String name;
    private String gender;
    private String subject;
    private String salary;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public String getSubject() {
        return subject;
    }
    public void setSubject(String subject) {
        this.subject = subject;
    }
    public String getSalary() {
        return salary;
    }
    public void setSalary(String salary) {
        this.salary = salary;
    }
    @Override
    public String toString() {
        return "Teacher [name=" + name + ", gender=" + gender + ", subject=" + subject + ", salary=" + salary + "]";
    }

其实:
1.首先是对JSON数据的一个分析 先把JSON文件读取转为字符串
2.其次是掌握JSON一些技巧(看到{}对象形JSONObject ,[]数组形JSONArray)
3.而后是对对应的属性值进行对应的字段封装建立对应的类(分析要细心,思路要清晰,程序这行需要有耐心不能浮躁)
4.而后是解析中要有明确的思路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值