JSON数据的简单处理
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它对人类的阅读习惯而言非常友好,可以轻松阅读和书写,并且对于机器来说也非常易于解析和生成。JSON相关信息可以到官网查看(http://www.json.org/)。

JSON的解析
JSON数据来源很多,比较常用的如本地文件、网络数据等,虽然来源不一,但是解析方法是一致的。此次要解析及生成的JSON数据如下:
{
    "fileName": "test.java",
    "encrypted": false,
    "author": "devsong",
    "function": [
        "genJSONFile",
        "parseJSONFile"
    ],
    "memberCount": 1,
    "description": "a demonstration of how to generate and parse JSON files",
    "createDate": "2017-08-05"
}
首先是生成JSON数据,而生成和解析JSON数据的方法有很多,此处介绍基本的生成及解析方法。此次演示依赖于开源项目JSON-java,可在GitHub上搜索到该项目(https://github.com/stleary/JSON-java)。

首先新建一个maven项目,并配置如下依赖(截至2017年8月5日,JSON-java最新版本为20170516):
  <dependencies>
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20170516</version>
    </dependency>
  </dependencies>
当然也可以不建立maven项目,手动导入依赖包,相关jar包可以在maven仓库找到(点此跳转)。

配置完成之后就可以利用JSONObject对象解析及生成JSON数据了。
方法一:通过简单的put方法生成JSON(只是简单地将生成的JSON数据打印输出)
    /**
     * 生成json文件
     */
    public static void genJSON() {
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("fileName", "test.java");
        jsonObj.put("author", "devsong");
        jsonObj.put("description", "a demonstration of how to generate and parse JSON files");
        jsonObj.put("createDate", "2017-08-05");
        jsonObj.put("function", new String[] { "genJSONFile", "parseJSONFile" });
        jsonObj.put("memberCount", 1);
        jsonObj.put("encrypted", false);

        System.out.println("===========generate JSON file by function 'put'============");
        System.out.println(jsonObj.toString());
    }
可以看到put方法支持放入很多种数据类型,但是由于其轻量级,也缺少了一些数据类型,比较明显的如Date数据类型,在JSON要想直观地描述日期通常只能是存入日期字符串。

方法二:通过map集合生成JSON
    /**
     * 通过map生成json
     */
    public static void genJSONByMap() {
        HashMap map = new HashMap<>();
        map.put("fileName", "test.java");
        map.put("author", "devsong");
        map.put("description", "a demonstration of how to generate and parse JSON files");
        map.put("createDate", "2017-08-05");
        map.put("function", new String[] { "genJSONFile", "parseJSONFile" });
        map.put("memberCount", 1);
        map.put("encrypted", false);

        JSONObject jsonObj = new JSONObject(map);
        System.out.println("
===========generate JSON file by map============");
        System.out.println(jsonObj.toString());
    }
由于map集合同JSON一样有k-v键值对存在,所以很容易就可以将map数据转换为JSON。事先将要存储的属性添加到mao集合里面,然后在实例化JSONObject对象的时候将map传入即可。

方法三:通过JavaBean生成JSON
首先要建立一个bean类:JavaFile.java
package org.devsong.beans;

import java.util.Arrays;

public class JavaFile {
    private String fileName;
    private String author;
    private String description;
    private String createDate;
    private String[] function;
    private int memberCount;
    private boolean encrypted;

    public JavaFile() {
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getCreateDate() {
        return createDate;
    }

    public void setCreateDate(String createDate) {
        this.createDate = createDate;
    }

    public String[] getFunction() {
        return function;
    }

    public void setFunction(String[] function) {
        this.function = function;
    }

    public int getMemberCount() {
        return memberCount;
    }

    public void setMemberCount(int memberCount) {
        this.memberCount = memberCount;
    }

    public boolean getEncrypted() {
        return encrypted;
    }

    public void setEncrypted(boolean encrypted) {
        this.encrypted = encrypted;
    }

    @Override
    public String toString() {
        return "JavaFile [fileName=" + fileName + ", author=" + author + ", description=" + description
                + ", createDate=" + createDate + ", function=" + Arrays.toString(function) + ", memberCount="
                + memberCount + ", encrypted=" + encrypted + "]";
    }

}
然后同map生成JSON一样,在实例化JSONObject的时候传入JavaBean对象。如下:
    /**
     * 通过JavaBean直接生成json格式数据
     */
    public static void genJSONByJavaBean() {
        JavaFile javaFile = new JavaFile();
        javaFile.setFileName("test.java");
        javaFile.setAuthor("devsong");
        javaFile.setDescription("a demonstration of how to generate and parse JSON files");
        javaFile.setCreateDate("2017-08-05");
        javaFile.setFunction(new String[] { "genJSONFile", "parseJSONFile" });
        javaFile.setMemberCount(1);
        javaFile.setEncrypted(false);
        
        System.out.println("
===========generate JSON file by JavaBean============");
        JSONObject jsonObj = new JSONObject(javaFile);
        System.out.println(jsonObj.toString());
    }

解析JSON数据
接下来是解析JSON数据,此处以本地文件为例。json数据存储在src/res目录下,名为test.json,要解析该文件,首先要将文件内容获取为String,方法很多,也可以借助第三方工具类,此处我是用基本的IO操作。代码如下(考虑到代码的健壮性,很多地方非常有必要采取一些安全措施,包括之前的生成代码,由于仅仅是演示,此处并未做相关处理):
    /**
     * 从文件中解析json
     * 只是简单获取了几个属性
     */
    public static void parseJSON() {
        File file = new File("src/res/test.json");
        try {

            FileReader fr = new FileReader(file);
            BufferedReader br = new BufferedReader(fr);
            String line;
            String content = "";
            while ((line = br.readLine()) != null) {
                content += line;
            }

            System.out.println("===========parse json file============");
            JSONObject jsonObj = new JSONObject(content);
            //获取属性:fileName
            String fileName = jsonObj.getString("fileName");
            System.out.println("fileName:" + fileName);

            //获取function数组并循环输出成员
            JSONArray jsonArray = jsonObj.getJSONArray("function");
            System.out.print("function:");
            for (int i = 0; i < jsonArray.length(); i++) {
                System.out.print(jsonArray.get(i) + "  ");
            }
            System.out.println();
            
            /********************************************
              考虑到程序的健壮性,对于null的处理是很关键的,此处获取json中存
              有的属性时应该先判断该属性是否存在,存在再获取!   应该采用以下形式:
              
                if(!jsonObj.isNull("item")) {
                    jsonObj.getXXX("item");
                }
              
             ********************************************/
            
            // 获取所有key
            // Set set = jsonObj.keySet();
            // Iterator ite = set.iterator();
            // while(ite.hasNext()) {
            // System.out.println(ite.next());
            // }

            // 打开源码可以发现,keys()方法返回的就是上述keySet()方法对应的set集的迭代器
            // Iterator ite1 = jsonObj.keys();
            // while(ite1.hasNext()) {
            // System.out.println(ite1.next());
            // }

            br.close();
            fr.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

方法测试
下面在main方法里面调用相关函数,测试程序执行是否正常。
    public static void main(String[] args) {
        genJSON();
        genJSONByMap();
        genJSONByJavaBean();
        parseJSON();
    }
程序输出结果如下:
===========generate JSON file by function 'put'============
{"fileName":"test.java","encrypted":false,"author":"devsong","function":["genJSONFile","parseJSONFile"],"memberCount":1,"description":"a demonstration of how to generate and parse JSON files","createDate":"2017-08-05"}

===========generate JSON file by map============
{"fileName":"test.java","encrypted":false,"author":"devsong","function":["genJSONFile","parseJSONFile"],"memberCount":1,"description":"a demonstration of how to generate and parse JSON files","createDate":"2017-08-05"}

===========generate JSON file by JavaBean============
{"fileName":"test.java","encrypted":false,"author":"devsong","memberCount":1,"function":["genJSONFile","parseJSONFile"],"description":"a demonstration of how to generate and parse JSON files","createDate":"2017-08-05"}

===========parse json file============
fileName:test.java
function:genJSONFile  parseJSONFile  
可见程序功能正常,其中属性顺序可能不一致,属正常情况,且不影响解析。
It's
欢迎访问本站,欢迎留言、分享、点赞。愿您阅读愉快!
*转载请注明出处,严禁非法转载。
https://www.devsong.org
QQ留言 邮箱留言
头像
引用:
取消回复
提交
涂鸦
涂鸦
热门