Java解析使用JSON的多种方法

XML的特点是功能全面,但标签繁琐,格式复杂。在Web上使用XML现在越来越少,取而代之的是JSON这种数据结构。JSON是JavaScript Object Notation的缩写,它去除了所有JavaScript执行代码,只保留JavaScript的对象格式。

开发Web应用的时候,使用JSON作为数据传输,在浏览器端非常方便。因为JSON天生适合JavaScript处理,所以,绝大多数REST API都选择JSON作为数据传输格式。现在问题来了:使用Java如何对JSON进行读写?

JSON优缺点介绍

JSON是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于阅读和编写,同时也易于解析和生成,可以在多种语言之间进行数据交换,并有效地提升网络传输效率,同时也易于机器解析和生成。它是基于ECMAScript的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯。

优点:

1、数据格式比较简单,易于编程人员阅读和编写,同时也易于计算机生成和解析。

2、支持多种语言,包括ActionScript,C,C#,ColdFusion,Java,JavaScript,Perl,PHP,Python,Ruby等语言服务器端语言,便于服务器端的解析。

3、因为JSON格式能够直接被服务器端代码使用,大大简化了服务器端和客户端的代码开发量,但是完成的任务不变,且易于维护。

缺点:

1、语法严谨,必须符合JSON语法规则。

2、要求字符集必须是Unicode,约束性强。

类库选择

在Java中,并没有内置JSON的解析,针对JSON也有标准的JSR 353 API,但是我们在前面讲XML的时候发现,如果能直接在XML和JavaBean之间互相转换是最好的。类似的,如果能直接在JSON和JavaBean之间转换,那么用起来就简单多了。

因此使用JSON需要借助第三方类库。下面是几个常用的 JSON 解析类库:

类型特点
传统JSON方式复杂的Json数据转换成实体类存在缺陷,性能和功能不够完善
Jackson方式复杂的Json数据转换成实体类存在缺陷,性能和功能优于传统方式
Gson方式功能方面在几种方式中最优,性能方面不如Jackson方式
FastJson方式复杂的实体类转换成Json数据存在缺陷,解析json的速度优于其他方式

FastJson教程讲解

环境配置

在 Maven 构建的项目中,在 pom.xml 文件中加入以下依赖即可。

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency>

编码

从 Java 变量到 JSON 格式的编码过程如下:

实例

public void testJson() {
    JSONObject object = new JSONObject();
    //string
    object.put("string","string");
    //int
    object.put("int",2);
    //boolean
    object.put("boolean",true);
    //array
    List<Integer> integers = Arrays.asList(1,2,3);
    object.put("list",integers);
    //null
    object.put("null",null);
​
    System.out.println(object);
}

在上例中,首先建立一个 JSON 对象,然后依次添加字符串、整数、布尔值以及数组,最后将其打印为字符串。

输出结果如下:

{"boolean":true,"string":"string","list":[1,2,3],"int":2}

解码

从 JSON 对象到 Java 变量的解码过程如下:

实例

public void testJson2() {
​
  JSONObject object = JSONObject
      .parseObject("{\"boolean\":true,\"string\":\"string\",\"list\":[1,2,3],\"int\":2}");
  //string
  String s = object.getString("string");
  System.out.println(s);
  //int
  int i = object.getIntValue("int");
  System.out.println(i);
  //boolean
  boolean b = object.getBooleanValue("boolean");
  System.out.println(b);
  //list
  List<Integer> integers = JSON.parseArray(object.getJSONArray("list").toJSONString(),Integer.class);
  integers.forEach(System.out::println);
  //null
  System.out.println(object.getString("null"));
​
}

在上例中,首先从 JSON 格式的字符串中构造一个 JSON 对象,之后依次读取字符串、整数、布尔值以及数组,最后分别打印,打印结果如下:

string
2
true
1
2
3
null

JSON 对象与字符串的相互转化

方法作用
JSON.parseObject()从字符串解析 JSON 对象
JSON.parseArray()从字符串解析 JSON 数组
JSON.toJSONString(obj/array)将 JSON 对象或 JSON 数组转化为字符串

实例

//从字符串解析JSON对象
JSONObject obj = JSON.parseObject("{\"likecs\":\"\"}");
//从字符串解析JSON数组
JSONArray arr = JSON.parseArray("[\"\",\"JB51\"]\n");
//将JSON对象转化为字符串
String objStr = JSON.toJSONString(obj);
//将JSON数组转化为字符串
String arrStr = JSON.toJSONString(arr);

原文地址: