您的位置:首页 > 移动开发 > Android开发

Android开发之解析JSon数据(二)

2013-09-27 20:29 501 查看
跟XML类似,JsonReader也可以解析文件中的JSon数据,下面的例子是从帮忙文档中取下来的

首先创建一个《JsonFile.txt》文件,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
     	}
   }
 ]


在Activity类中开始解析数据如下

package com.example.jsondemo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.os.Environment;
import android.os.Message;
import android.app.Activity;
import android.util.JsonReader;
import android.util.JsonToken;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
	private Button btn = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		btn = (Button) findViewById(R.id.btn);
		btn.setOnClickListener(new btnListener());
	}

	private class btnListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			String path = Environment.getExternalStorageDirectory() + File.separator + "JsonFile.txt";
			System.out.println("-----------btnListener---------" + path);
			
			try {
				readJsonStream(new FileInputStream(path));
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public List<Message> readJsonStream(InputStream in) throws IOException {
		JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));
		try {
			return readMessagesArray(reader);
		} finally {
			reader.close();
		}
	}

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

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

	public Message 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();
				System.out.println("id = " + id);
			} else if (name.equals("text")) {
				text = reader.nextString();
				System.out.println("text = " + text);
			} else if (name.equals("geo") && reader.peek() != JsonToken.NULL) {
				geo = readDoublesArray(reader);
				System.out.println("geo = " + geo);
			} else if (name.equals("user")) {
				user = readUser(reader);
				System.out.println("user = " + user);
			} else {
				reader.skipValue();
			}
		}
		reader.endObject();
		return new Message();
	}

	public List<Double> readDoublesArray(JsonReader reader) throws IOException {
		List<Double> doubles = new ArrayList<Double>();

		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);
	}
}


解析后打印出来的结果



示例代码

点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: