基于Java的JSON文件解析

1 JSON简介

1.1 什么是JSON

JSON(JavaScript Object Notation),中文译作“JavaScript 对象表示法”,简单来说,以一种特定的格式进行描述一系列的对象,并进行存储和使用。

在JSON解析对象之前还有XML解析对象,但后来通过测试发现,JSON在传输数据上,比XML要快很多,越多的数据,体现出来的差异越明显。

JSON 可以视为一种数据编写的格式。
例:

{
	"name" : "张三",
	"age" : 24,
	"info" : {
		"grade" : "研二",
		"sex" : "men",
		"boby" : ["篮球","足球","游泳","跑步"],
		"college" : "清华"
	}
}

JSON的格式很清晰,且很简单,接下来简述一下其中标识的一些含义。

  • “{}”,括住的内容,是一个对象的内容。
  • JSON对象中,是允许嵌套对象的。
  • JSON每个属性之间用","隔开
  • JSON数据中的"[ ]"所括住的部分,是数组。在Java中,默认解析为集合的形式。
  • JSON存储的形式就像是键值对。左边的属性名是键(不能重复),右边属性值是值,中间以":"隔开

针对与这种类型的数据,在以后的开发中,我们经常会遇到JSON类型数据的导入和导出的使用。

在Java中有两种常用的JSON解析工具

  • FastJson(阿里推出的JSON解析工具类)
  • Gson(Google推出的JSON解析工具类)

这两个jar文件都可以在网上下载到,

2 用Gson操作JSON

常用方法:

  • toJson方法,将对象转换成JSON格式的字符串
  • fromJson方法,将JSON类型的字符串转换成对象

2.1 将对象转换为JSON字符串

public class Demo01 {
    public static void main(String[] args) {
        Gson g = new Gson();
        //Book定义了id、name、info三个属性,都是String类型
        Book b = new Book("1001","鬼谷子","谋略奇书");
        //将b对象转换成JSON文件格式对象
        String s = g.toJson(b);
        System.out.println(s);
        ArrayList<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王二麻子");
        System.out.println(g.toJson(list));
        String[] strings = new String[10];
        for (int i = 0; i < 10; i++) {
            strings[i] = "第"+(i+1)+"只羊";
        }
        System.out.println(g.toJson(strings));
    }
}

运行结果:

{"id":"1001","name":"鬼谷子","info":"谋略奇书"}
["张三","李四","王二麻子"]
["第1只羊","第2只羊","第3只羊","第4只羊","第5只羊","第6只羊","第7只羊","第8只羊","第9只羊","第10只羊"]

Book类

public class Book {
    private String id;
    private String name;
    private String info;
	//省略get/set方法,toString,构造器
}

注意:JSON转换的对象,必须要有get/set方法。否则转换会出错。
如果有布尔类型的量的set方法名,一定是要是isXxx的格式。

2.2 将JSON类型的字符串转换为对象

public class Demo02 {
    public static void main(String[] args) {
        //转换:  {"id":"1001","name":"鬼谷子","info":"谋略奇书"}
        String text = "{\"id\":\"1001\",\"name\":\"鬼谷子\",\"info\":\"谋略奇书\"}";
        Gson g = new Gson();
        Book book = g.fromJson(text, Book.class);
        System.out.println(book);
        Integer[] strs = g.fromJson("[3,10,12]",Integer[].class);
        String str = Arrays.toString(strs);
        System.out.println(str);
        ArrayList<String> strings = g.fromJson("[第1只羊, 第2只羊, 第3只羊, 第4只羊, 第5只羊, 第6只羊, 第7只羊, 第8只羊, 第9只羊, 第10只羊]",ArrayList.class);
        System.out.println(strings);
    }
}

3 用FastJson操作JSON

FastJson工具类和Gson使用不同之处在于,其方法是静态的。你可以直接类名 . 方法。这里我再演示一下如何操作一个文件内的JSON对象。

3.1 对象转化成JSON

public class Demo03 {
    public static void main(String[] args) {
        Book book = new Book("1002","唐诗三百首","床前明月光,疑是地上霜,举头望明月,低头思故乡。");
        String string = JSON.toJSONString(book);
        System.out.println(string);
    }
}

运行结果:

{"id":"1002","info":"床前明月光,疑是地上霜,举头望明月,低头思故乡","name":"唐诗三百首"}

3.2 JSON转换为对象

这里给定一个json文件(hhha.json)

[
  {
    "name" : "张三",
    "age" : 30,
    "hoby" : ["游泳","跳远","爬山"],
    "detail" : {
      "high" : 183,
      "weight" : "74kg",
      "sex" : "男",
      "parents" : ["爸爸","妈妈","儿子","老婆"]
    }
  },
  {
    "name" : "李四",
    "age" : 29,
    "hoby" : ["游泳","篮球","爬山"],
    "detail" : {
      "high" : 173,
      "weight" : "66kg",
      "sex" : "男",
      "parents" : ["爸爸","妈妈","女儿","老婆"]
    }
  }
]

使用输入流,读取文件字节流,然后进行转换

public class Demo05 {
    public static void main(String[] args) throws IOException {
        //转换:  {"id":"1002","info":"床前明月光,疑是地上霜,举头望明月,低头思故乡","name":"唐诗三百首"}
        Book book = JSON.parseObject("{\"id\":\"1002\",\"info\":\"床前明月光,疑是地上霜,举头望明月,低头思故乡\",\"name\":\"唐诗三百首\"}",Book.class);
        System.out.println(book);

        InputStreamReader isr = new InputStreamReader(new FileInputStream("hhha.json"));
        StringBuilder sb = new StringBuilder();
        char[] chs = new char[1024];
        int len = -1;
        while ((len=isr.read(chs))!=-1){
            sb.append(chs,0,len);
        }
        isr.close();
        String text = sb.toString();
        List<Person> p = JSON.parseObject(text, List.class);
        System.out.println(p);
    }
}

如果以后碰到一个恨到的JSON文件,进行读取的时候,使用大数组进行读取,会加快文件的读写速度,提高效率。

注意:因为读取的文件中可能存在特殊文字的情况,请不要直接使用InputStream进行读取操作,这可能会导致有读取到“半个”文字的情况。使用BufferedReader或者InputStreamReader都可以。

4 总结

JSON文件,一个文件,只会存储一个类型的对象,有多个对象时,会采用数组的方式进行存储同类型的所有变量。一个JSON文件绝对不允许出现两种不同类型的变量,因为这样读取数据的时候,很可能因为类型不同,读取出现数据读取异常等情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值