JSON解析:
如图
1.去掉最外面的{}:JSONObject jsonObject = new JSONObject(str);//可以理解为去掉最外层的{}
2.取出books数组: JSONArray books = jsonObject.getJSONArray("books");
3.再取出数组中的每一个object,并且转化为JSONObject形式。
for (Object book : books) {
//获取单个JSONObject对象
JSONObject bookObject = (JSONObject) book;}
备注:同时还有Jackson和GSON等第三方库方法来处理json格式文件。如果需要实现json转化为对象,则使用这两个第三方库比较简单。
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 采用org.json包来解析JSON
* @author Tom
*
*/
public class OrgJsonTest {
public static void main(String[] args) {
testJsonObject();
System.out.println("=========华丽丽的分割线==============");
testJsonFile();
}
public static void testJsonObject() {
//构造对象
Person p = new Person();
p.setName("Tom");
p.setAge(20);
p.setScores(Arrays.asList(60,70,80));
//构造JSONObject对象
JSONObject obj = new JSONObject();
//string
obj.put("name", p.getName());
//int
obj.put("age", p.getAge());
//array
obj.put("scores", p.getScores());
//null不可以放入null
//object.put("null", null);
System.out.println(obj);
System.out.println("name: " + obj.getString("name"));
System.out.println("age: " + obj.getInt("age"));
System.out.println("scores: " + obj.getJSONArray("scores"));
}
public static void testJsonFile() {
File file = new File("books.json");
try (FileReader reader = new FileReader(file)) {
//读取文件内容到JsonObject对象中
int fileLen = (int) file.length();
char[] chars = new char[fileLen];
reader.read(chars);
String s = String.valueOf(chars);
System.out.println(s+"\n");
JSONObject jsonObject = new JSONObject(s);//可以理解为去掉最外层的{}
//开始解析JSONObject对象
JSONArray books = jsonObject.getJSONArray("books");
List<Book> bookList = new ArrayList<>();
for (Object book : books) {
//获取单个JSONObject对象
JSONObject bookObject = (JSONObject) book;
Book book1 = new Book();
book1.setAuthor(bookObject.getString("author"));
book1.setYear(bookObject.getString("year"));
book1.setTitle(bookObject.getString("title"));
book1.setPrice(bookObject.getInt("price"));
book1.setCategory(bookObject.getString("category"));
bookList.add(book1);
}
for(Book book:bookList)
{
System.out.println(book.getAuthor() + ", " + book.getTitle());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出:
{"scores":[60,70,80],"name":"Tom","age":20}
name: Tom
age: 20
scores: [60,70,80]
=========华丽丽的分割线==============
{
"books": [
{
"category": "COOKING",
"title": "Everyday Italian",
"author": "Giada De Laurentiis",
"year": "2005",
"price": 30.00
},
{
"category": "CHILDREN",
"title": "Harry Potter",
"author": "J K. Rowling",
"year": "2005",
"price": 29.99
},
{
"category": "WEB",
"title": "Learning XML",
"author": "Erik T. Ray",
"year": "2003",
"price": 39.95
}
]
}
Giada De Laurentiis, Everyday Italian
J K. Rowling, Harry Potter
Erik T. Ray, Learning XML
同时还有Jackson和GSON等第三方库方法来处理json格式文件。
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.reflect.TypeToken;
/**
* 采用Jackson来处理JSON
* @author Tom
*
*/
public class JacksonTest {
public static void main(String[] args) throws Exception {
testJsonObject();
System.out.println("=========华丽丽的分割线==============");
testJsonFile();
}
static void testJsonObject() throws IOException {
ObjectMapper om = new ObjectMapper();
//构造对象
Person p = new Person();
p.setName("Tom");
p.setAge(20);
p.setScores(Arrays.asList(60,70,80));
//将对象解析为json字符串
String jsonStr = om.writeValueAsString(p);
System.out.println(jsonStr);
//从json字符串重构对象
Person p2 = om.readValue(jsonStr, Person.class);
System.out.println(p2.getName());
System.out.println(p2.getAge());
System.out.println(p2.getScores());
//从json字符串重构为JsonNode对象
JsonNode node = om.readTree(jsonStr);
System.out.println(node.get("name").asText());
System.out.println(node.get("age").asText());
System.out.println(node.get("scores"));
}
static void testJsonFile() throws IOException {
ObjectMapper om = new ObjectMapper();
//从json文件中加载,并重构为java对象
File json2 = new File("books2.json");
List<Book> books = om.readValue(json2, new TypeReference<List<Book>>(){});
for (Book book : books) {
System.out.println(book.getAuthor());
System.out.println(book.getTitle());
}
}
}
{"name":"Tom","age":20,"scores":[60,70,80]}
Tom
20
[60, 70, 80]
Tom
20
[60,70,80]
=========华丽丽的分割线==============
Giada De Laurentiis
Everyday Italian
J K. Rowling
Harry Potter
Erik T. Ray
Learning XML
import java.io.File;
import java.io.FileReader;
import java.util.Arrays;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
/**
* 采用Google GSON来处理JSON
* @author Tom
*
*/
public class GsonTest {
public static void main(String[] args) {
testJsonObject();
System.out.println("=========华丽丽的分割线==============");
testJsonFile();
}
public static void testJsonObject() {
//构造对象
Person p = new Person();
p.setName("Tom");
p.setAge(20);
p.setScores(Arrays.asList(60,70,80));
//从Java对象到JSON字符串
Gson gson = new Gson();
String s = gson.toJson(p);
System.out.println(s); //{"name":"Tom","age":20,"scores":[60,70,80]}
//从JSON字符串到Java对象
Person p2 = gson.fromJson(s, Person.class);
System.out.println(p2.getName()); //Tom
System.out.println(p2.getAge()); //20
System.out.println(p2.getScores());//[60, 70, 80]
//调用GSON的获取JsonObject
JsonObject json = gson.toJsonTree(p).getAsJsonObject(); //将整个json解析为一颗树
System.out.println(json.get("name")); //"Tom"
System.out.println(json.get("age")); //20
System.out.println(json.get("scores"));//[60,70,80]
}
public static void testJsonFile() {
Gson gson = new Gson();
File file = new File("books2.json");
try (FileReader reader = new FileReader(file)) {
List<Book> books = gson.fromJson(reader, new TypeToken<List<Book>>(){}.getType());
for(Book book : books)
{
System.out.println(book.getAuthor() + ", " + book.getTitle());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出:
{"name":"Tom","age":20,"scores":[60,70,80]}
Tom
20
[60, 70, 80]
"Tom"
20
[60,70,80]
=========华丽丽的分割线==============
Giada De Laurentiis, Everyday Italian
J K. Rowling, Harry Potter
Erik T. Ray, Learning XML
参考中国大学mooc 《Java核心技术》