android开发之json解析,Android开发:JSON解析实例

json文本解析类JSONTokener

按照RFC4627规范将json文本解析为相应的对象。

对于将json文本解析为对象,只需要用到该类的两个api:

构造函数

public Object nextValue();

//  {

//      "phone" : ["12345678", "87654321"], // 数组

//      "name" : "yuanzhifei89", // 字符串

//      "age" : 100, // 数值

//      "address" : { "country" : "china", "province" : "jiangsu" }, // 对象

//      "married" : false // 布尔值

//  }

privatestaticfinalString JSON =

"{"+

"   \"phone\" : [\"12345678\", \"87654321\"],"+

"   \"name\" : \"yuanzhifei89\","+

"   \"age\" : 100,"+

"   \"address\" : { \"country\" : \"china\", \"province\" : \"jiangsu\" },"+

"   \"married\" : false,"+

"}";

try{

JSONTokener jsonParser = newJSONTokener(JSON);

// 此时还未读取任何json文本,直接读取就是一个JSONObject对象。

// 如果此时的读取位置在"name" : 了,那么nextValue就是"yuanzhifei89"(String)

JSONObject person = (JSONObject) jsonParser.nextValue();

// 接下来的就是JSON对象的操作了

person.getJSONArray("phone");

person.getString("name");

person.getInt("age");

person.getJSONObject("address");

person.getBoolean("married");

} catch(JSONException ex) {

// 异常处理代码

}

其它的api基本就是用来查看json文本中的文本的:

try{

JSONTokener jsonParser = newJSONTokener(JSON);

// 继续向下读8个json文本中的字符。此时刚开始,即在{处

jsonParser.next(8);//{    "phone。tab算一个字符

// 继续向下读1个json文本中的字符

jsonParser.next(); //"

// 继续向下读取一个json文本中的字符。该字符不是空白、同时也不是注视中的字符

jsonParser.nextClean(); //:

// 返回当前的读取位置到第一次遇到'a'之间的字符串(不包括a)。

jsonParser.nextString('a');//  ["12345678", "87654321"],    "n(前面有两个空格)

// 返回当前读取位置到第一次遇到字符串中(如"0089")任意字符之间的字符串,同时该字符是trimmed的。(此处就是第一次遇到了89)

jsonParser.nextTo("0089");//me" : "yuanzhifei

// 读取位置撤销一个

jsonParser.back();

jsonParser.next(); //i

// 读取位置前进到指定字符串处(包括字符串)

jsonParser.skipPast("address");

jsonParser.next(8);//" : { "c

// 读取位置前进到执行字符处(不包括字符)

jsonParser.skipTo('m');

jsonParser.next(8);//married"

} catch(JSONException ex) {

// 异常处理代码

}

以下是一个标准的JSON请求实现过程:

HttpPost request =newHttpPost(url);

// 先封装一个 JSON 对象

JSONObject param = newJSONObject();

param.put("name","rarnu");

param.put("password","123456");

// 绑定到请求 Entry

StringEntity se = newStringEntity(param.toString());

request.setEntity(se);

// 发送请求

HttpResponse httpResponse = newDefaultHttpClient().execute(request);

// 得到应答的字符串,这也是一个 JSON 格式保存的数据

String retSrc = EntityUtils.toString(httpResponse.getEntity());

// 生成 JSON 对象

JSONObject result = newJSONObject( retSrc);

String token = result.get("token");

下面这个是自己修改别人的小例子,主要是加一些注释和讲解,这个例子主要是使用android进行json解析。

单数据{'singer':{'id':01,'name':'tom','gender':'男'}}

多个数据{"singers":[

{'id':02,'name':'tom','gender':'男'},

{'id':03,'name':'jerry,'gender':'男'},

{'id':04,'name':'jim,'gender':'男'},

{'id':05,'name':'lily,'gender':'女'}]}

下面的类主要是解析单个数据parseJson()和多个数据的方法parseJsonMulti():

publicclassJsonActivityextendsActivity {

/** Called when the activity is first created. */

privateTextView tvJson;

privateButton btnJson;

privateButton btnJsonMulti;

@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

tvJson = (TextView) this.findViewById(R.id.tvJson);

btnJson = (Button) this.findViewById(R.id.btnJson);

btnJsonMulti = (Button) this.findViewById(R.id.btnJsonMulti);

btnJson.setOnClickListener(newView.OnClickListener() {

@Override

publicvoidonClick(View v) {

// url

// String strUrl = "http://10.158.166.110:8080/AndroidServer/JsonServlet";

String strUrl = ServerPageUtil.getStrUrl(UrlsOfServer.JSON_SINGER);

//获得返回的Json字符串

String strResult = connServerForResult(strUrl);

//解析Json字符串

parseJson(strResult);

}

});

btnJsonMulti.setOnClickListener(newView.OnClickListener() {

@Override

publicvoidonClick(View v) {

String strUrl = ServerPageUtil.getStrUrl(UrlsOfServer.JSON_SINGERS);

String strResult = connServerForResult(strUrl);

//获得多个Singer

parseJsonMulti(strResult);

}

});

}

privateString connServerForResult(String strUrl) {

// HttpGet对象

HttpGet httpRequest = newHttpGet(strUrl);

String strResult = "";

try{

// HttpClient对象

HttpClient httpClient = newDefaultHttpClient();

// 获得HttpResponse对象

HttpResponse httpResponse = httpClient.execute(httpRequest);

if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {

// 取得返回的数据

strResult = EntityUtils.toString(httpResponse.getEntity());

}

} catch(ClientProtocolException e) {

tvJson.setText("protocol error");

e.printStackTrace();

} catch(IOException e) {

tvJson.setText("IO error");

e.printStackTrace();

}

returnstrResult;

}

// 普通Json数据解析

privatevoidparseJson(String strResult) {

try{

JSONObject jsonObj = newJSONObject(strResult).getJSONObject("singer");

intid = jsonObj.getInt("id");

String name = jsonObj.getString("name");

String gender = jsonObj.getString("gender");

tvJson.setText("ID号"+id +", 姓名:"+ name +",性别:"+ gender);

} catch(JSONException e) {

System.out.println("Json parse error");

e.printStackTrace();

}

}

//解析多个数据的Json

privatevoidparseJsonMulti(String strResult) {

try{

JSONArray jsonObjs = newJSONObject(strResult).getJSONArray("singers");

String s = "";

for(inti =0; i 

JSONObject jsonObj = ((JSONObject)jsonObjs.opt(i))

.getJSONObject("singer");

intid = jsonObj.getInt("id");

String name = jsonObj.getString("name");

String gender = jsonObj.getString("gender");

s +=  "ID号"+id +", 姓名:"+ name +",性别:"+ gender+"\n";

}

tvJson.setText(s);

} catch(JSONException e) {

System.out.println("Jsons parse error !");

e.printStackTrace();

}

}

}

【编辑推荐】

【责任编辑:Pockey TEL:(010)68476606】

点赞 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值