利用JsonReade和JsonReader實現json解析和寫數據


  前面講過調用谷歌的json包來對json數據進行解析,隨着android的發展現在手機系統都是android4.0以上版本了,因此可以直接調用sdk 中的JsonReader來解析json數據了。json數據的解析成現有的類,這些類通常是javaBean類,通過查看官方的文檔將其文檔的例子完善了下如下:

json數據:

[
   {
     "id": 912345678901,
     "text": "How do I read JSON on Android?",
     "geo": null,
     "user": 
	{
       "name": "android_newb",
       "followers_count": 41
     	 }
    },
   {
     "id": 912345678902,
     "text": "@android_newb just use android.util.JsonReader!",
     "geo": [50.454722, -104.606667],
     "user": 
	{
       "name": "jesse",
       "followers_count": 2
     	}
    }
 ]

需要解析出來的類:

package com.example.user.myjosn;

import java.util.List;

/**
 * Created by user on 2016/10/18.
 */
public class MyMessage {

    long  id;
    String text;
    List geo;
    User user;
    public MyMessage(long id,String text, User user, List geo)
    {
        this.id= id;
        this.user= user;
        this.geo = geo;
        this.text = text;
    }

}
class  User
{
    public  User(String name,int count)
    {
        this.name= name;
        this.followers_count = count;
    }
    String name;
    int followers_count;
}

 解析json的類:調用readJsonStream函數就可以解析出該json文件,該解析和xml解析相似,開頭分reader.beginArray 和reader.beginObject 第一個是接下來解析一個數組,通常里面嵌套解析一個解析另外個對象的函數,后面一個就是解析對象,然后就是相應的end結束語句,且對象里面含有對象,因此對象的讀取是嵌套實現的:

package com.example.user.myjosn;

import android.os.Message;
import android.util.JsonReader;
import android.util.JsonToken;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by user on 2016/10/18.
 */
public class MyMessageJsonReader {
/*
    in 為要讀取的文件的輸入流
 */
    public  List readJsonStream(InputStream in) throws IOException {
        JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
        try {
            return readMessagesArray(reader);
        }
            finally{
                reader.close();
            }
        }


    public List readMessagesArray(JsonReader reader) throws IOException {
        List messages = new ArrayList();

        reader.beginArray();
        while (reader.hasNext()) {
            messages.add(readMessage(reader));
        }
        reader.endArray();
        return messages;
    }

    public MyMessage readMessage(JsonReader reader) throws IOException {
        long id = -1;
        String text = null;
        User user = null;
        List geo = null;

        reader.beginObject();
        while (reader.hasNext()) {
            String name = reader.nextName();
            if (name.equals("id")) {
                id = reader.nextLong();
            } else if (name.equals("text")) {
                text = reader.nextString();
            } else if (name.equals("geo") && reader.peek() != JsonToken.NULL) {//后面一個判斷geo的值不為空,因為有可能為空
                geo = readDoublesArray(reader);
            } else if (name.equals("user")) {
                user = readUser(reader);
            } else {
                reader.skipValue();
            }
        }
        reader.endObject();
        return new MyMessage(id, text, user, geo);
    }

    //讀取double型的數組,主要是讀取geo項的數組
    public List readDoublesArray(JsonReader reader) throws IOException {
        List doubles = new ArrayList();

        reader.beginArray();
        while (reader.hasNext()) {
            doubles.add(reader.nextDouble());
        }
        reader.endArray();
        return doubles;
    }

    public User readUser(JsonReader reader) throws IOException {
        String username = null;
        int followersCount = -1;

        reader.beginObject();
        while (reader.hasNext()) {
            String name = reader.nextName();
            if (name.equals("name")) {
                username = reader.nextString();
            } else if (name.equals("followers_count")) {
                followersCount = reader.nextInt();
            } else {
                reader.skipValue();
            }
        }
        reader.endObject();
        return new User(username, followersCount);
    }


}

  解析完了后得到了list對象,存儲的是MyMessage對象,下面我們利用JsonWriter來自己寫json數據:寫的內容就是上面的得到的list里面的MyMessage對象,寫的內容和讀的一模一樣:下面給出寫的類:

 

package com.example.user.myjosn;

import android.util.JsonWriter;

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.List;

/**
 * Created by user on 2016/10/18.
 */
public class MyMessageJsonWriter {

    public  void writeJsonStream(OutputStream out, List messages) throws IOException {
        JsonWriter writer = new JsonWriter(new OutputStreamWriter(out, "UTF-8"));
        writer.setIndent("  ");
        writeMessagesArray(writer, messages);
        writer.close();
    }


    public void writeMessagesArray(JsonWriter writer, List messages) throws IOException {
        writer.beginArray();
        for (Object message : messages) {
            writeMessage(writer,(MyMessage) message);
        }
        writer.endArray();
    }

    public void writeMessage(JsonWriter writer, MyMessage message) throws IOException {
        writer.beginObject();
        writer.name("id").value(message.getId());
        writer.name("text").value(message.getText());
        if (message.getGeo() != null) {
            writer.name("geo");
            writeDoublesArray(writer, message.getGeo());
        } else {
            writer.name("geo").nullValue();
        }
        writer.name("user");
        writeUser(writer, message.getUser());
        writer.endObject();
    }

    public void writeUser(JsonWriter writer, User user) throws IOException {
        writer.beginObject();
        writer.name("name").value(user.getName());
        writer.name("followers_count").value(user.getFollowers_count());
        writer.endObject();
    }

    public void writeDoublesArray(JsonWriter writer, List doubles) throws IOException {
        writer.beginArray();
        for (Object value : doubles) {
            writer.value((Double)value);
        }
        writer.endArray();
    }

}

  主函數Activity:

package com.example.user.myjosn;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    ArrayList<MyMessage> list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //讀取data目錄下的json數據存儲到集合中
        try {
           InputStream in = new FileInputStream( "data/data/com.example.user.myjosn/files/jsondemo.txt");
            MyMessageJsonReader mJson = new MyMessageJsonReader();
            list = (ArrayList<MyMessage>) mJson.readJsonStream(in);
            System.out.println("第一個"+list.get(0).id);

        } catch (FileNotFoundException e) {
            System.out.println("文件沒找到");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("讀取文件失敗");
            e.printStackTrace();
        }

        //將上面得到的MyMessage對象的數據寫入成json數據
        try {
            OutputStream outputStream =  openFileOutput("message", Context.MODE_PRIVATE);
            MyMessageJsonWriter myMessageJsonWriter = new MyMessageJsonWriter();
            myMessageJsonWriter.writeJsonStream(outputStream, list);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM