前面我已经给大家讲了利用GJson 解析一个简单的JSON,接下来演示一个较常见的Json文件(gjon 官方给的示例)
1.Json 文件
[
{
"id": 10011,
"text": "How I read a Json Stream in Java",
"geo": null,
"user": {
"name": "json_newb",
"followers_cout": 41
}
},
{
"id": 10022,
"text": "JSON test",
"geo":[11.32,-104.11],
"user": {
"name": "json_newb",
"followers_cout": 41
}
}
]
2-1、根据Json文件可以看出Json需一个主类
class Message{
private long id;
private String text;
private ArrayList<Double> geo;
public User user;
@Override
public String toString() {
return "Message{" +
"id=" + id +
", text='" + text + '\'' +
", geo=" + geo +
", user=" + user +
'}';
}
public Message() {
}
public Message(long id, String text, ArrayList<Double> geo, User user) {
this.id = id;
this.text = text;
this.geo = geo;
this.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;
}
}
2-2、在主类里包含一个user的类
class User{
private String name;
private Integer followers_cout;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", followers_cout=" + followers_cout +
'}';
}
public User() {
}
public User(String name, Integer followers_cout) {
this.name = name;
this.followers_cout = followers_cout;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getFollowers_cout() {
return followers_cout;
}
public void setFollowers_cout(Integer followers_cout) {
this.followers_cout = followers_cout;
}
}
3.配置Maven
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.4</version>
</dependency>
4.编写实现代码
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Mtest {
public static void main(String[] args) throws IOException {
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("messages.json");//加载
InputStreamReader in=new InputStreamReader(is);//转换为reader
JsonReader jsonReader= new JsonReader(in);//装载
ArrayList<Message> list = readmessageArray(jsonReader);//交给Message 数组处理方法处理,并返回一个List对象
//-----------验证
list.forEach((m)->{
System.out.println(m.toString());
});
}
//1.读取Meagess 数组
private static ArrayList<Message> readmessageArray(JsonReader jsonReader) throws IOException {
ArrayList<Message> list=new ArrayList<>();
jsonReader.beginArray();
while (jsonReader.hasNext()){
list.add(readMessage(jsonReader));
}
jsonReader.endArray();
return list;
}
//2.解析Message 对象
private static Message readMessage(JsonReader jsonReader) throws IOException {
Message ms= new Message();
jsonReader.beginObject();
while (jsonReader.hasNext()){
String name = jsonReader.nextName();
if ("id".equals(name)){
ms.setId(jsonReader.nextLong());
}else if ("text".equals(name)){
ms.setText(jsonReader.nextString());
}else if ("geo".equals(name) && jsonReader.peek()!= JsonToken.NULL){
ms.setGeo(readgeo(jsonReader));
}else if ("user".equals(name)){
ms.setUser(readuser(jsonReader));
}else {
jsonReader.skipValue();//注意这里一定要加,否则遇到Null会报错
}
};
jsonReader.endObject();
return ms;
}
//3.读取GEO数组
private static ArrayList<Double> readgeo(JsonReader jsonReader) throws IOException {
ArrayList<Double> list=new ArrayList<>();
jsonReader.beginArray();
while (jsonReader.hasNext()){
list.add(jsonReader.nextDouble());
}
jsonReader.endArray();
return list;
}
//4.读取user对象
private static User readuser(JsonReader jsonReader) throws IOException {
User user=new User();
jsonReader.beginObject();
while (jsonReader.hasNext()){
String tag=jsonReader.nextName();
if("name".equals(tag)){
user.setName(jsonReader.nextString());
}else if ("followers_cout".equals(tag)){
user.setFollowers_cout(jsonReader.nextInt());
}else {
jsonReader.skipValue();//注意这里一定要加,否则遇到Null会报错
}
}
jsonReader.endObject();
return user;
}
}
效果
Message{id=10011, text='How I read a Json Stream in Java', geo=null, user=User{name='json_newb', followers_cout=41}}
Message{id=10022, text='JSON test', geo=[11.32, -104.11], user=User{name='json_newb', followers_cout=41}}
总结:遇到JSON结构中[]用数组,遇到{}就是对象
那么请分析如下Json文件并实现解析
{"WarehouseID":"9999999","WarehouseAddress":"深圳市福田区福田保税区","CallBack":"0000012","MemberID":"123456","ShipperCode":"ZTO","LogisticCode":"1234561","OrderCode":"1234561","MonthCode":"","PayType":"1","ExpType":"1","Cost":12,"OtherCost":0,"Receiver":{"Company":"腾讯科技","Name":"张三","Tel":"0755-0907283","Mobile":"13709076789","PostCode":"435100","ProvinceName":"广东省","CityName":"深圳市","ExpAreaName":"福田区","Address":"深南大道2009号"},"Sender":{"Company":"快金数据","Name":"李四","Tel":"0755-1111111","Mobile":"13932080778","PostCode":"435100","ProvinceName":"广东省","CityName":"深圳市","ExpAreaName":"福田区","Address":"福田保税区"},"StartDate":"","EndDate":"","Weight":3,"Quantity":1,"Volume":2,"Remark":"","AddService":[{"Name":"","Value":"","CustomerID":""},{"Name":"","Value":"","CustomerID":""},{"Name":"","Value":""}],"Commodity":[{"GoodsName":"书本","GoodsCode":"20398","Goodsquantity":1,"GoodsPrice":100,"GoodsWeight":2,"GoodsVol":10,"GoodsDesc":"格林童话"}]}