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