`
wangleyiang
  • 浏览: 220899 次
社区版块
存档分类
最新评论

Android Json解析

阅读更多

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。

JSON建构于两种结构:

  • “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
  • 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。

 

详细情况参考:http://www.json.org/json-zh.html

 

在org.json包下有一些和Json相关的类,方便开发者进行和Json相关的一些操作。下面以一个简单的例子做说明,解析assets下的Json文件:

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Handler.Callback;
import android.widget.TextView;

public class TestJsonActivity extends Activity {

	private TextView textView;

	private Handler mHandler = new Handler(new Callback() {

		@Override
		public boolean handleMessage(Message msg) {
			try {
				textView.append(msg.getData().getString("data"));
				return true;
			} catch (Exception e) {
				e.printStackTrace();
			}
			return false;
		}
	});

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		textView = new TextView(this);
		setContentView(textView);

		parserJsonFileFromAsset();

	}

	/**
	 * 解析Assets文件夹下的JSON文件
	 */
	private void parserJsonFileFromAsset() {

		new Thread(new Runnable() {

			@Override
			public void run() {

				InputStream inputStream = null;
				try {
					
					inputStream = getAssets().open("data.json");
					JSONObject jsonObject = new JSONObject(inputStream2String(inputStream));
					
					JSONArray dataListA = jsonObject.getJSONArray("data_list_a");
					for (int i = 0, length = dataListA.length(); i < length; i++) {
						// 耗时5秒
						Thread.sleep(5 * 1000);
						JSONObject dataObject = (JSONObject) dataListA.get(i);
						// 设置数据到DataInfo
						DataInfo dataInfo = new DataInfo();
						dataInfo.setType("Data List A");
						dataInfo.setId(dataObject.getString("id"));
						dataInfo.setName(dataObject.getString("name"));
						dataInfo.setAddress(dataObject.getString("address"));
						// 发送消息,更新UI
						Message msg = new Message();
						Bundle data = new Bundle();
						data.putString("data", dataInfo.toString());
						msg.setData(data);
						mHandler.sendMessage(msg);
					}
					
					JSONArray dataListB = jsonObject.getJSONArray("data_list_b");
					for (int i = 0, length = dataListB.length(); i < length; i++) {
						Thread.sleep(5 * 1000);
						JSONObject dataObject = (JSONObject) dataListB.get(i);
						DataInfo dataInfo = new DataInfo();
						dataInfo.setType("Data List B");
						dataInfo.setId(dataObject.getString("id"));
						dataInfo.setName(dataObject.getString("name"));
						dataInfo.setAddress(dataObject.getString("address"));
						Message msg = new Message();
						Bundle data = new Bundle();
						data.putString("data", dataInfo.toString());
						msg.setData(data);
						mHandler.sendMessage(msg);
					}
					
				} catch (Exception e) {
					e.printStackTrace();
				} finally {
					if (inputStream != null) {
						try {
							inputStream.close();
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
				}

			}

		}).start();

	}

	/**
	 * 
	 * @param inputStream
	 * @param bufferSize
	 * @return
	 * @throws Exception
	 */
	private String inputStream2String(InputStream inputStream, int bufferSize) throws Exception {

		int i = -1;
		byte[] b = new byte[bufferSize];
		StringBuffer sb = new StringBuffer();
		while ((i = inputStream.read(b)) != -1) {
			sb.append(new String(b, 0, i));
		}
		return sb.toString();

	}

	/**
	 * 
	 * @param inputStream
	 * @return
	 * @throws Exception
	 */
	private String inputStream2String(InputStream inputStream)
			throws Exception {

		int i = -1;
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		while ((i = inputStream.read()) != -1) {
			baos.write(i);
		}
		return baos.toString();

	}
	
	/**
	 * 
	 * @author oss
	 *
	 */
	class DataInfo {
		
		private String type;
		private String id;
		private String name;
		private String address;
		
		public DataInfo() {
			
		}
		
		public void setType(String type) {
			this.type = type;
		}
		
		public String getType() {
			return type;
		}
		
		public void setId(String id) {
			this.id = id;
		}
		
		public String getId() {
			return id;
		}
		
		public void setName(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
		public void setAddress(String address) {
			this.address = address;
		}
		
		public String getAddress() {
			return address;
		}
		
		@Override
		public String toString() {
			StringBuffer stringBuffer = new StringBuffer();
			stringBuffer.append("Type:  " + type);
			stringBuffer.append("\nID:  " + id);
			stringBuffer.append("\nName:  " + name);
			stringBuffer.append("\nAddress:  " + address + "\n\n");
			return stringBuffer.toString();
		}
		
	}

}

 说明:

  • mHandler:更新UI,从msg中获得需要的数据,并在UI中显示;
  • 解析是一个比较费时的操作,所以放到线程中做,避免ANR的发生;
  • Json解析相对容易理解,都是一些对象的获得,然后使用getter获的对应key的value即可;
  • Thread.sleep(5 * 1000);模拟耗时操作;

被解析的数据格式:

{
   "data_list_a":[
      {
         "id":"11",
         "name":"name a 1",
         "address":"address a 1"
      }
   ],
   "data_list_b":[
      {
         "id":"11",
         "name":"name b 1",
         "address":"address b 1"
      },
      {
         "id":"22",
         "name":"name b 2",
         "address":"address b 2"
      }
   ]
}

 

多说一句:解析代码比较少,大部分是JavaBean和使用Handler更新UI的代码!:)

 

 

 

分享到:
评论

相关推荐

    android JSON解析数据 android解析天气预报

    笔者近期做到对天气预报JSON数据解析,在此小记。 天气预报接口:http://wthrcdn.etouch.cn/weather_mini?citykey=101200101 JSON数据如下: { desc: OK, status: 1000, data: { wendu: 14, ganmao: 天气...

    Android Json 解析demo

    在“Android Json 解析demo”项目中,可能包含了创建JSON解析器的代码示例,以及如何在Android Studio中运行和测试这些功能的步骤。你可以通过查看项目中的JsonDemo文件来学习具体的实现细节,包括如何读取网络上的...

    android json解析(包含服务器端,客户端)

    本教程将深入讲解Android客户端和服务器端如何进行JSON解析。 一、JSON基础 JSON是一种轻量级的文本格式,它基于JavaScript的一个子集。数据格式简单,易于人阅读和编写,同时也易于机器解析和生成。基本数据类型...

    android json 解析jar

    Android JSON解析jar指的是在Android项目中用于解析JSON数据的Java库,通常以.jar文件形式提供。 本主题主要关注的是`gson`库,这是一个由Google提供的强大JSON库,它允许将Java对象转换为JSON字符串,以及将JSON...

    Android json解析jar包

    标题“Android json解析jar包”指的是在Android应用中使用特定的jar包来处理JSON数据。在Java和Android开发中,解析JSON数据通常需要引入外部库,比如Gson,因为Android SDK本身并没有内置高级的JSON解析功能。 ...

    android JSon解析例子

    一、Android JSON解析库 Android SDK本身提供了`org.json`包,包含`JSONObject`和`JSONArray`类,可以用于基础的JSON解析。除此之外,还有许多第三方库,如Gson、Jackson、Fastjson和Square的OkHttp与Retrofit,它们...

    Android_JSON数据解析

    Retrofit是另一种流行的Android网络库,它允许更优雅地处理网络请求和响应,包括JSON解析。添加依赖: ```groovy implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation '...

    Android JSON解析示例代码.txt

    ### Android JSON解析示例代码详解 #### 一、概述 在Android开发中,JSON作为一种轻量级的数据交换格式被广泛应用于客户端与服务器之间的数据交互。本文档将通过一个具体的示例来详细介绍如何在Android应用程序中...

    Android json解析数据

    4. **Android JSON解析API**:Android提供了一些基础的JSON解析API,如`JSONObject`和`JSONArray`,它们提供了解析和构建JSON的方法。但这些API较为基础,对于复杂JSON结构,可能需要手动遍历。 **三、解析JSON对象...

    AndroidJSON解析框架GSON

    **Android JSON解析框架GSON详解** 在Android应用开发中,数据交换经常采用JSON格式,因为它轻量级、易于阅读和编写,并且被广泛支持。为了高效地解析和生成JSON,Google提供了一个强大的库——GSON。GSON允许将...

    android JSON解析放入ListView

    在Android开发中,JSON(JavaScript Object Notation)是一种轻量级的...综上,Android中将JSON解析并放入ListView涉及到网络请求、JSON解析、数据绑定等多个环节,通过合理的设计和优化,可以构建出高效、流畅的应用。

    Android JSON 解析库的使用

    本文将详细介绍两种常用的Android JSON解析库——Gson和Fast-json,以及它们的特点、优势、基本用法,并通过实际应用案例展示如何在Android项目中有效利用它们。 1. Gson库 Gson是Google提供的一个Java库,能够将...

    android json解析demo

    在Android开发中,理解并熟练使用JSON解析是至关重要的,因为它允许应用程序与服务器进行高效的数据交互。本示例将深入讲解如何在Android中解析JSON数据。 1. JSON基本结构: JSON基于JavaScript语法,但不依赖...

    android 动态解析获取json数据的键值对

    在Android开发中,有时我们需要从服务器获取JSON数据并解析它以展示在应用中。这个"android 动态解析获取json数据的键值对"的项目就是针对这种情况的一个实例,主要展示了如何在Eclipse环境下,不预先创建JSON键值...

    android json解析代码生成器

    通过编写配置文件,该代码生成器能自动生成相应的bean,和解析json的代码。 你需要做的是,有一个ruby环境,将配置...生成json解析代码: ruby json_parser.rb &gt; JSONParser.java 不使用重定向,模式是打印在终端中。

    Android 的 JSON解析源码

    理解并能熟练运用JSON解析对于一个Android开发者来说至关重要。本篇文章将深入探讨Android平台上的JSON解析源码,帮助你更好地理解和优化你的应用性能。 一、JSON基本结构 JSON主要包含两种数据结构:对象和数组。...

    Android json解析

    1. Android自带的JSON解析库:`org.json`,包含两个主要类,`JSONObject`用于处理对象,`JSONArray`用于处理数组。 2. Google推荐的Gson库:提供了一种将Java对象转换为JSON字符串,以及从JSON字符串反序列化为Java...

Global site tag (gtag.js) - Google Analytics