JsonReader解析json應用

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
    }
  }
]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章