前面講過調用谷歌的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(); } } }