使用网络爬虫向服务器发送请求时,服务器经常返回的数据是包含JSON的字符串,如下所示:
jQuery6({
"id":"07",
"language":"C++",
"edition":"second",
"author":"E.Balagurusamy"
})
上述字符串虽包含JSON,但并不能直接用org.json、Gson和Fastjson等工具进行直接解析,因为其头部和尾部包含多余的字符(“jQuery6(”和“)”)。为使上述字符串能够正常解析,需要对其进行预处理(掐头去尾)操作,将其转化成标准的JSON字符串。
package com.zb.book.parse;
//JSON预处理
public class ParseJSON {
public static void main(String[] args) {
//JSON
String json = "jQuery6({\n" +
"\t\"id\":\"07\",\n" +
"\t\"language\":\"C++\",\n" +
"\t\"edition\":\"second\",\n" +
"\t\"author\":\"E.Balagurusamy\"\n" +
"})";
//预处理
String attr = json.split("\\(")[1];
System.out.println(attr.substring(0,attr.length()-1));
}
}
{
"id":"07",
"language":"C++",
"edition":"second",
"author":"E.Balagurusamy"
}
与处理好的JSON字符串可以复制到JSON在线校准网站进行校准(常用);
org.json是Java中常用的一款JSON解析工具,其常用的两个类是JSONObject和JSONArray;
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20200518</version>
</dependency>
在解析数据时,常用getString(String key)方法获取JSON数据中key值对应的value值;
package com.zb.book.parse;
import org.json.JSONObject;
//JSON解析
public class ParseJSON {
public static void main(String[] args) {
//JSON
String json = "jQuery6({\n" +
"\t\"id\":\"07\",\n" +
"\t\"language\":\"C++\",\n" +
"\t\"edition\":\"second\",\n" +
"\t\"author\":\"E.Balagurusamy\"\n" +
"})";
//预处理
String attr = json.split("\\(")[1];
attr = attr.substring(0,attr.length()-1);
//解析
JSONObject jsonObject = new JSONObject(attr);
System.out.println(jsonObject.getString("id"));
System.out.println(jsonObject.getString("language"));
System.out.println(jsonObject.getString("edition"));
System.out.println(jsonObject.getString("author"));
}
}
07
C++
second
E.Balagurusamy
JSONArray类的功能是解析JSON数组,该类中包括一些实例化JSONArray对象的构造方法、获取指定JSONObject对象的方法等。
package com.zb.book.parse;
import org.json.JSONArray;
import org.json.JSONObject;
//JSON解析
public class ParseJSON {
public static void main(String[] args) {
//JSON
String json = "jQuery6([{\n" +
"\t\"id\":\"07\",\n" +
"\t\"language\":\"C++\",\n" +
"\t\"edition\":\"second\",\n" +
"\t\"author\":\"E.Balagurusamy\"\n" +
"},{\n" +
"\t\"id\":\"08\",\n" +
"\t\"language\":\"C++\",\n" +
"\t\"edition\":\"second\",\n" +
"\t\"author\":\"E.Balagurusamy\"\n" +
"}])";
//预处理
String attr = json.split("\\(")[1];
attr = attr.substring(0,attr.length()-1);
//解析
JSONArray jsonArray = new JSONArray(attr);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
System.out.println(jsonObject.getString("id"));
System.out.println(jsonObject.getString("language"));
System.out.println(jsonObject.getString("edition"));
System.out.println(jsonObject.getString("author"));
System.out.println();
}
}
}
07
C++
second
E.Balagurusamy
08
C++
second
E.Balagurusamy
Gson是Google提供的处理JSON数据的Java类库,主要用于转换Java对象和JSON对象;
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
package com.zb.book.parse.gson;
import com.google.gson.Gson;
//Gson解析JSON对象
public class ParseJSONObject {
public static void main(String[] args) {
//实例化Gson对象
Gson gson = new Gson();//方法一
//Gson gson = new GsonBuilder().create();方法二
String json = "{\n" +
"\t\"name\":\"Java程序设计\",\n" +
"\t\"page\":\"800\",\n" +
"\t\"money\":\"98\"\n" +
"}";
//解析成Book对象
Book book = gson.fromJson(json, Book.class);
System.out.println(book.toString());
//book{name='Java程序设计', page='800', money='98'}
}
}
class Book {
private String name;
private String page;
private String money;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
public String getMoney() {
return money;
}
public void setMoney(String money) {
this.money = money;
}
@Override
public String toString() {
return "book{" +
"name='" + name + '\'' +
", page='" + page + '\'' +
", money='" + money + '\'' +
'}';
}
}
package com.zb.book.parse.gson;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
//Gson解析JSON对象
public class ParseJSONObject {
public static void main(String[] args) {
//实例化Gson对象
Gson gson = new Gson();//方法一
//Gson gson = new GsonBuilder().create();方法二
String json = "[{\n" +
"\t\"name\":\"Java程序设计\",\n" +
"\t\"page\":\"800\",\n" +
"\t\"money\":\"98\"\n" +
"},{\n" +
"\t\"name\":\"C语言程序设计\",\n" +
"\t\"page\":\"700\",\n" +
"\t\"money\":\"88\"\n" +
"}]";
//TypeToken操作,可支持类型包括泛型
Type listType = new TypeToken<List<Book>>() {}.getType();
//转化成集合
List<Book> list = gson.fromJson(json, listType);
//循环打印
for (Book book : list) {
System.out.println(book.toString());
}
//book{name='Java程序设计', page='800', money='98'}
//book{name='C语言程序设计', page='700', money='88'}
}
}
class Book {
private String name;
private String page;
private String money;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
public String getMoney() {
return money;
}
public void setMoney(String money) {
this.money = money;
}
@Override
public String toString() {
return "book{" +
"name='" + name + '\'' +
", page='" + page + '\'' +
", money='" + money + '\'' +
'}';
}
}
json示例:
{
"name" : "訾博",
"tall" : "183CM",
"books" : [
{
"name":"Java程序设计",
"page":"800",
"money":"98"
},{
"name":"C语言程序设计",
"page":"700",
"money":"88"
}
]
}
java代码:
package com.zb.book.parse.gson;
import com.google.gson.Gson;
import java.util.List;
//Gson解析JSON对象
public class ParseJSONObject {
public static void main(String[] args) {
//实例化Gson对象
Gson gson = new Gson();//方法一
//Gson gson = new GsonBuilder().create();方法二
String json = "{\n" +
"\t\"name\" : \"訾博\",\n" +
"\t\"tall\" : \"183CM\",\n" +
"\t\"books\" : [\n" +
"\t\t{\n" +
"\t\t\"name\":\"Java程序设计\",\n" +
"\t\t\"page\":\"800\",\n" +
"\t\t\"money\":\"98\"\n" +
"\t\t},{\n" +
"\t\t\t\"name\":\"C语言程序设计\",\n" +
"\t\t\t\"page\":\"700\",\n" +
"\t\t\t\"money\":\"88\"\n" +
"\t\t}\n" +
"\t]\n" +
"}";
//转化成集合
People people = gson.fromJson(json, People.class);
//打印
System.out.println(people);
List<Book> books = people.getBooks();
for (Book book : books) {
System.out.println(book);
}
}
}
class People{
private String name;
private String tall;
private List<Book> books;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTall() {
return tall;
}
public void setTall(String tall) {
this.tall = tall;
}
public List<Book> getBooks() {
return books;
}
public void setBooks(List<Book> books) {
this.books = books;
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", tall='" + tall + '\'' +
", books=" + books +
'}';
}
}
class Book {
private String name;
private String page;
private String money;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
public String getMoney() {
return money;
}
public void setMoney(String money) {
this.money = money;
}
@Override
public String toString() {
return "book{" +
"name='" + name + '\'' +
", page='" + page + '\'' +
", money='" + money + '\'' +
'}';
}
}
运行结果:
People{name='訾博', tall='183CM', books=[book{name='Java程序设计', page='800', money='98'}, book{name='C语言程序设计', page='700', money='88'}]}
book{name='Java程序设计', page='800', money='98'}
book{name='C语言程序设计', page='700', money='88'}
Fastjson是阿里巴巴基于Java语言开发的高性能且功能完善的JSON操作类库;
Fastjson解析JSON的方式与Gson类似,都是讲JSON数据转化为JavaBean对象;
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
package com.zb.book.parse.fastjson;
import com.alibaba.fastjson.JSON;
//使用fastJson解析JSON对象
public class ParseJSONObject {
public static void main(String[] args) {
String json = "{\n" +
"\t\"name\":\"Java程序设计\",\n" +
"\t\"page\":\"800\",\n" +
"\t\"money\":\"98\"\n" +
"}";
//使用fastJson解析JSON对象
Book book = JSON.parseObject(json, Book.class);
System.out.println(book.toString());
//book{name='Java程序设计', page='800', money='98'}
}
}
class Book {
private String name;
private String page;
private String money;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
public String getMoney() {
return money;
}
public void setMoney(String money) {
this.money = money;
}
@Override
public String toString() {
return "book{" +
"name='" + name + '\'' +
", page='" + page + '\'' +
", money='" + money + '\'' +
'}';
}
}
package com.zb.book.parse.fastjson;
import com.alibaba.fastjson.JSON;
import java.util.List;
//使用fastJson解析JSON对象
public class ParseJSONObject {
public static void main(String[] args) {
String json = "[\n" +
"\t{\n" +
"\t\"name\":\"Java程序设计\",\n" +
"\t\"page\":\"800\",\n" +
"\t\"money\":\"98\"\n" +
"\t},{\n" +
"\t\t\"name\":\"C语言程序设计\",\n" +
"\t\t\"page\":\"700\",\n" +
"\t\t\"money\":\"88\"\n" +
"\t}\n" +
"]";
//使用fastJson解析JSON对象
//方法一
List<Book> books = JSON.parseArray(json, Book.class);
//方法二
//List<Book> books = JSON.parseObject(json, new TypeReference<List<Book>>() {});
for (Book book : books) {
System.out.println(book.toString());
}
//book{name='Java程序设计', page='800', money='98'}
//book{name='C语言程序设计', page='700', money='88'}
}
}
class Book {
private String name;
private String page;
private String money;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
public String getMoney() {
return money;
}
public void setMoney(String money) {
this.money = money;
}
@Override
public String toString() {
return "book{" +
"name='" + name + '\'' +
", page='" + page + '\'' +
", money='" + money + '\'' +
'}';
}
}