测试用例来自官方API文档
JSON类
package com.vince.json;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class JsonDemo2 {
/**
* 使用JsonReader解析负责的Json数据
*/
@Test
public void parseJSONMessages(){
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/vince/message.json");
InputStreamReader in=new InputStreamReader(is);
JsonReader jsonReader=new JsonReader(in);
ArrayList<Message> list= readMessageArray(jsonReader);
for (Message m:list){
System.out.println(m);
}
}
//读取Message数组
private ArrayList<Message> readMessageArray(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;
}
//解析一个Message对象
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()!= JsonToken.NULL){//跳过空的设置
m.setGeo(readGeo(jsonReader));
}else if("usr".equals(name)){
m.setUser(readUser(jsonReader));
}else {
jsonReader.skipValue();//&&jsonReader.peek()!= JsonToken.NULL 不成立跳过去
}
}
jsonReader.endObject();
} catch (IOException e) {
e.printStackTrace();
}
return m;
}
/**
* 解析User对象
* @param jsonReader
* @return
*/
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.nextName());
}else if("followers_count".equals(name)){
user.setFollowers_count(jsonReader.nextInt());
}else {
jsonReader.skipValue();
}
}
jsonReader.endObject();
} catch (IOException e) {
e.printStackTrace();
}
return user;
}
/**
* 解析GEO数组
* @param jsonReader
* @return
*/
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;
}
}
创建Message类
package com.vince.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;
}
public Message(long id, String text, ArrayList<Double> geo, User user) {
this.id = id;
this.text = text;
this.geo = geo;
this.user = user;
}
public Message() {
}
@Override
public String toString() {
return "Message{" +
"id=" + id +
", text='" + text + '\'' +
", geo=" + geo +
", user=" + user +
'}';
}
}
创建User类
package com.vince.json;
public class User {
private String name;
private int followers_count;
public User(String name, int followers_count) {
this.name = name;
this.followers_count = followers_count;
}
public User() {
}
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
}
}
]