JSON(JavaScript Object Notation)是一 種輕量級的數據交換格式。JSON官方:http://www.json.org
JSON數據格式的特點
JSON建構於兩種結構:
1、“名稱/值”對的集合
2.、 值的有序列表(數組)
JSON表示名稱/值對的方式: { “firstName”: “vince”, “lastName’”." ma", “email”:“finally_ _m@ foxmail.com” }
一個大括號代表一個對象,屬性要用雙引號,屬性值字符串用雙引號,整數小數不需要雙引號
表示數組
{ “user”:[ { “firstName”: “vince”, “lastName”:“ma”, “email”: “[email protected]” },
{ “firstName”: “lin”, “lastName”:“jacks”, “email”: “[email protected]”}]
GSON組件的使用
GSON是Google開發的Java API,用於轉換Java對象和Json對象。
下載地址:http://www.mvnrepository.com/artifact/com.google.code.gson/gson
解析JSON:JsonReader reader = new JsonReader(new StringReader(jsonData));
生成JSON:
private String createJSON(ArrayList<User> users) {
JSONObject jsonObject = new JSONObject();
JSONArray array = new JSONArray();
int size = users.size();
try {for (int i = 0; i < size; i++) {
User user = users.get(i);
JSONObject object = new JSONObject();
object.put("name", user.name);
object.put("age", user.age);
array.put(object);}
jsonObject.put("users",array);
return jsonObject.toString();
} catch (JSONException e) {e.printStackTrace();}
return null;
}
static class User {String name; int age;//…}
使用 Gson 直接把 JSON 數據轉換成 Java 對象
public Student parserJSON2(String data){
Gson gson = new Gson();
Student s = gson.fromJson(data, Student.class);
return s;
}
使用 Gson 直接把 JSON 數組轉換成 Java 對象
public List<Student> parserJSON3(String data){
Type type = new TypeToken<ArrayList<Student>>(){}.getType();
Gson gson = new Gson();
List<Student> list = gson.fromJson(data, type);
return list;
}
XML與JSON的比較
從以下6點比較JSON與XML:
1、JSON和XML的數據可讀性基本相同
2、JSON和XML同樣擁有豐富的解析手段
3、JSON相對於XML來講,數據的體積小
4、JSON與JavaScript的交互更加方便
5、JSON對數據的描述性比XML較差
6、JSON的速度要遠遠快於XML
適合的場景:
(1)數據傳輸:JSON要比XML更有優勢
(2)存儲數據:XML描述性更強
(3)XML通常用做配置文件
解析簡單數組示例:
package com.json;
import com.google.gson.stream.JsonReader;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
public class JsonArrayDemo {
@Test
private void JsonParserArrayDemo(){
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/json/names.json");
InputStreamReader is = new InputStreamReader(in);
//創建json解析器
JsonReader Reader = new JsonReader(is);
ArrayList<Names> list = new ArrayList<>();
try {
//開始解析數組
Reader.beginArray();
while (Reader.hasNext()){
list.add(jsonObject(Reader));
}
//解析數組結束
Reader.endArray();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(Arrays.toString(list.toArray()));
}
private Names jsonObject(JsonReader Reader ){
Names names=null;
try {
//開始解析數組對象
Reader.beginObject();
names = new Names();
while (Reader.hasNext()){
String attrName = Reader.nextName();
if("firstName".equals(attrName)){
names.setFirstName(Reader.nextString());
}else if("lastName".equals(attrName)){
names.setLastName(Reader.nextString());
}else if("email".equals(attrName)){
names.setEmail(Reader.nextString());
}
}
//數組對象解析結束
Reader.endObject();
} catch (IOException e) {
e.printStackTrace();
}
return names;
}
}
數據對象類:
package com.json;
public class Names {
private String firstName;
private String lastName;
private String email;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Message{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", email='" + email + '\'' +
'}';
}
}
json文件:
[
{"firstName":"Vince","lastName":"Ma","email":"[email protected]"},
{"firstName":"Jason","lastName":"Hunter","email":"[email protected]"}
]
解析複雜json代碼
package com.json;
import com.google.gson.stream.JsonReader;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class JsonDemo {
@Test
private void jsonMain(){
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/json/message.json");
InputStreamReader in = new InputStreamReader(is);
JsonReader jsonReader = new JsonReader(in);
ArrayList<Message> list = readMessageArrays(jsonReader);
for(Message m:list){
System.out.println(m);
}
}
//讀取Message對象
private ArrayList<Message> readMessageArrays(JsonReader jsonReader) {
ArrayList<Message> list = new ArrayList<>();
try {
//開始解析數組
jsonReader.beginArray();
while (jsonReader.hasNext()){
list.add(readMessage(jsonReader));
}
jsonReader.endArray();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
private Message readMessage(JsonReader jsonReader) {
Message m = new Message();
//開始解析對象
try {
jsonReader.beginObject();
while (jsonReader.hasNext()){
String name = jsonReader.nextName();
if("id".equals(name)){
m.setId(jsonReader.nextLong());
}else if("text".equals(name)){
m.setText(jsonReader.nextString());
}else if("geo".equals(name) && jsonReader.peek()!=null){
m.setGeo(readGeo(jsonReader));
}else if("user".equals(name)){
m.setUser(readUser(jsonReader));
}else {
jsonReader.skipValue();//解析不到跳過
}
}
jsonReader.endObject();
} catch (IOException e) {
e.printStackTrace();
}
return m;
}
//開始解析User
private User readUser(JsonReader jsonReader) {
User user = new User();
try {
jsonReader.beginObject();
while (jsonReader.hasNext()){
String name = jsonReader.nextName();
if("name".equals(name)){
user.setName(jsonReader.nextString());
}else if("followers_count".equals(name)){
user.setFollowers_count(jsonReader.nextInt());
}else{
jsonReader.skipValue();
}
}
jsonReader.endObject();
} catch (IOException e) {
e.printStackTrace();
}
return user;
}
//開始解析Geo
private ArrayList<Double> readGeo(JsonReader jsonReader) {
ArrayList<Double> list = new ArrayList<>();
try {
jsonReader.beginArray();
while (jsonReader.hasNext()){
list.add(jsonReader.nextDouble());
}
jsonReader.endArray();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
}
數據對象類:
package com.json;
import java.util.ArrayList;
public class Message {
private Long id;
private String text;
private ArrayList<Double> geo;
private User user;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public ArrayList<Double> getGeo() {
return geo;
}
public void setGeo(ArrayList<Double> geo) {
this.geo = geo;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String toString() {
return "Message{" +
"id=" + id +
", text='" + text + '\'' +
", geo=" + geo +
", user=" + user +
'}';
}
}
數據對象類:
package com.json;
public class User {
private String name;
private int followers_count;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getFollowers_count() {
return followers_count;
}
public void setFollowers_count(int followers_count) {
this.followers_count = followers_count;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", followers_count=" + followers_count +
'}';
}
}
json文件:
[
{
"id": 912345678901,
"text": "How do I read a JSON stream in Java?",
"geo": null,
"user": {
"name": "json_newb",
"followers_count": 41
}
},
{
"id": 912345678902,
"text": "@json_newb just use JsonReader!",
"geo": [50.454722, -104.606667],
"user": {
"name": "jesse",
"followers_count": 2
}
}
]