身为新手,在运用网络解析json数据的时候,发现先会用Gson等框架解析json,然后就懒起来学原生解析了,这下在看别人写的demo的时候就尴尬了,一块块的,不懂写什么,气氛十分尴尬。

不多说,先来条好bolg的链接:http://blog.csdn.net/android_lyp/article/details/52072822

JSON对数据的描述形式,既然是形式,那么它的数据形式是什么样的:

    • 对象的描述是: {}
    • 数组的描述是: []
    • 属性或值的描述是: “”
    • 连接之间的描述是: :
  • 手动创建javaBean对象的看JSON数据,请记住:拿到一些JSON数据,首先看符号, 有个原则,从外到内看,看到{}这个是个对象,就创建对象,看到[]就创建数据,
  • 但是这里有个问题,看![{},{}],这个看,1. 创建一个List容器 2. 再看里面,{}就创建对象,说明这个容器的泛型就是这个对象

原生解析个人不推荐用,因为加载数据的性能比较低,如果写的界面适配器写的不好等因素加起来的话,加载数据就很慢很慢,现在有很多热门的库类例如Gson等等

Activity中的网络解析(因为没用框架,所以代码会臃肿但是方便开发 ,不利于后面维护)

(1)原生解析---》getJsonObject

package com.tfot.hotel.yichengyiyu.Activity.zhou_activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView; import com.squareup.okhttp.Call;
import com.squareup.okhttp.FormEncodingBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
import com.tfot.hotel.yichengyiyu.Activity.NewActivivty.XiangQingActivity;
import com.tfot.hotel.yichengyiyu.Activity.NewActivivty.XiangQingActivity_Long;
import com.tfot.hotel.yichengyiyu.Activity.zhou_activity.adapter.ChaXunJieGuoAdapter;
import com.tfot.hotel.yichengyiyu.Activity.zhou_activity.bean.ChaXunJieGuo;
import com.tfot.hotel.yichengyiyu.R;
import com.tfot.hotel.yichengyiyu.Util.Common;
import com.tfot.hotel.yichengyiyu.Util.base.BaseActivity; import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject; import java.io.IOException;
import java.util.ArrayList;
import java.util.List; import rx.Observable;
import rx.Observer;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import rx.subscriptions.CompositeSubscription; /**
* 查询结果界面
* Created by huizhou on 2017/6/26.
*/ public class ChaXunJieGuoActivity extends BaseActivity {
private List<ChaXunJieGuo> chaXunJieGuoList=new ArrayList<>(); //查询结果数据源
private String changOrduang ;// CONDITION 判断长租或者短租的字符串
private Boolean yeOrNo = false ;//查询内容是否存在
private String sousuoneiron;
private ListView activity_chaxunjieguo_list;
private ImageView activivty_chaxunjieguo_fanhuui;
private ChaXunJieGuoAdapter chaXunJieGuoAdapter;
private View kongbaiye_sousuo; private CompositeSubscription mCompositeSubscription;//第三方线程
private final OkHttpClient client = new OkHttpClient();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chaxunjieguo_l);
Intent intent = getIntent();
Bundle bundle=intent.getExtras();//.getExtras()得到intent所附带的额外数据
changOrduang = bundle.getString("changOrduang");
sousuoneiron = bundle.getString("sousuojieguoneiron");
initData(); } private void initData() { mCompositeSubscription = new CompositeSubscription(); //第三方线程 activity_chaxunjieguo_list = (ListView) findViewById(R.id.activity_chaxunjieguo_list);
activivty_chaxunjieguo_fanhuui = (ImageView) findViewById(R.id.activivty_chaxunjieguo_fanhuui); kongbaiye_sousuo = findViewById(R.id.kongbaiye_sousuo); //空白页 chaxunjieguo(sousuoneiron);
chaXunJieGuoAdapter = new ChaXunJieGuoAdapter(ChaXunJieGuoActivity.this,chaXunJieGuoList);
activity_chaxunjieguo_list.setAdapter(chaXunJieGuoAdapter); activity_chaxunjieguo_list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//TODO 查询条目跳转
Intent intent =null;
if(changOrduang.equals("day")){
intent = new Intent(ChaXunJieGuoActivity.this, XiangQingActivity.class); //短租的房间详情页
}else if(changOrduang.equals("long")){
intent = new Intent(ChaXunJieGuoActivity.this, XiangQingActivity_Long.class); //长租的房间详情页
}
Bundle bundle = new Bundle();
bundle.putString("RoomStyleId",chaXunJieGuoList.get(position).getRoomStyleId());
bundle.putString("Brandname",chaXunJieGuoList.get(position).getBrandname());
intent.putExtras(bundle);
startActivity(intent); }
}); activivty_chaxunjieguo_fanhuui.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
}); } //查询结果的的网路连接
private void chaxunjieguo(final String chaxuneironB){
Subscription subscription = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
RequestBody formBody = new FormEncodingBuilder()
.add("ACT", "likesearch")
.add("CONDITION",changOrduang)
.add("content",chaxuneironB)
.build(); final Request request = new Request.Builder()
.url(Common.NEW_CHAXUNJIEGUO)
.post(formBody)
.build(); Call call = client.newCall(request);
try {
Response response = call.execute();
subscriber.onNext(response.body().string());
subscriber.onCompleted();
} catch (IOException e) {
e.printStackTrace();
}
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
//原生解析
try {
JSONArray array = new JSONArray(s);
chaXunJieGuoList.clear();
for (int i = 0; i < array.length(); i++) {
JSONObject temp = (JSONObject) array.get(i);
String RoomStyleId=temp.getString("RoomStyleId");
String Unitprice=temp.getString("Unitprice");
String evaluate=temp.getString("evaluate");
JSONObject banner=temp.getJSONObject("Brand"); String Brandname=banner.getString("Brandname"); JSONArray jsonArray=temp.getJSONArray("RoomStyleImage");
ArrayList<String> RoomStyleImage=new ArrayList<String>();
for (int i2=0;i2<jsonArray.length();i2++){
String a= Common.BASIC_IC_API+jsonArray.get(i).toString();
RoomStyleImage.add(a);
}
String RoomStyleAddres=temp.getString("RoomStyleAddres");
String Roomlongrentom=temp.getString("Roomlongrentom");
String RoomStyleName = temp.getString("RoomStyleName");
String RoomStar = temp.getString("RoomStar");
ChaXunJieGuo chaXunJieGuoData = new ChaXunJieGuo(RoomStyleId,Unitprice,
evaluate, Brandname,RoomStyleImage,RoomStyleAddres,Roomlongrentom,RoomStyleName,RoomStar);
chaXunJieGuoList.add(chaXunJieGuoData);
}
if(!chaXunJieGuoList.isEmpty()){
kongbaiye_sousuo.setVisibility(View.GONE);
activity_chaxunjieguo_list.setVisibility(View.VISIBLE);
}else{
kongbaiye_sousuo.setVisibility(View.VISIBLE);
activity_chaxunjieguo_list.setVisibility(View.GONE);
}
} catch (JSONException e) {
e.printStackTrace();
}
chaXunJieGuoAdapter.notifyDataSetChanged();
}
});
mCompositeSubscription.add(subscription);
}
}

bean

package com.tfot.hotel.yichengyiyu.Activity.zhou_activity.bean;

import java.io.Serializable;
import java.util.ArrayList; /**
* Created by huizhou on 2017/6/26.
*/ public class ChaXunJieGuo implements Serializable {
private String RoomStyleId;
private String Unitprice;
private String evaluate;
private String Brandname;
private ArrayList<String> RoomStyleImage;
private String RoomStyleAddres;
private String Roomlongrentom;
private String RoomStyleName;
private String RoomStar; public String getRoomStyleName() {
return RoomStyleName;
} public void setRoomStyleName(String roomStyleName) {
RoomStyleName = roomStyleName;
} public ChaXunJieGuo(String roomStyleId, String unitprice, String evaluate, String brandname,ArrayList<String> roomStyleImage, String roomStyleAddres, String roomlongrentom,String roomStyleName,String roomStar) {
RoomStyleId = roomStyleId;
Unitprice = unitprice;
this.evaluate = evaluate;
Brandname = brandname;
RoomStyleImage = roomStyleImage;
RoomStyleAddres = roomStyleAddres;
Roomlongrentom = roomlongrentom;
RoomStyleName = roomStyleName;
RoomStar = roomStar;
} public String getRoomStar() {
return RoomStar;
} public void setRoomStar(String roomStar) {
RoomStar = roomStar;
} public String getRoomStyleId() {
return RoomStyleId;
} public void setRoomStyleId(String roomStyleId) {
RoomStyleId = roomStyleId;
} public String getUnitprice() {
return Unitprice;
} public void setUnitprice(String unitprice) {
Unitprice = unitprice;
} public String getEvaluate() {
return evaluate;
} public void setEvaluate(String evaluate) {
this.evaluate = evaluate;
} public String getBrandname() {
return Brandname;
} public void setBrandname(String brandname) {
Brandname = brandname;
} public ArrayList<String> getRoomStyleImage() {
return RoomStyleImage;
} public void setRoomStyleImage(ArrayList<String> brandbigimage) {
RoomStyleImage = brandbigimage;
} public String getRoomStyleAddres() {
return RoomStyleAddres;
} public void setRoomStyleAddres(String roomStyleAddres) {
RoomStyleAddres = roomStyleAddres;
} public String getRoomlongrentom() {
return Roomlongrentom;
} public void setRoomlongrentom(String roomlongrentom) {
Roomlongrentom = roomlongrentom;
} @Override
public String toString() {
return "ChaXunJieGuo{" +
"RoomStyleId='" + RoomStyleId + '\'' +
", Unitprice='" + Unitprice + '\'' +
", evaluate='" + evaluate + '\'' +
", Brandname='" + Brandname + '\'' +
", RoomStyleImage=" + RoomStyleImage +
", RoomStyleAddres='" + RoomStyleAddres + '\'' +
", Roomlongrentom='" + Roomlongrentom + '\'' +
", RoomStyleName='" + RoomStyleName + '\'' +
", RoomStar='" + RoomStar + '\'' +
'}';
}
}

其实,后台传来的数据不止那么少对象,我们来看看后台传过来的json格式是什么

[
{
"RoomStyleId":"51",
"RoomStyleName":"商务双床",
"RoomStyleAddres":"佛山市南海区桂澜北路万达广场C座",
"RoomStylePrice":"2720",
"RoomStyleguarantee":"3860",
"RoomStyleLng":"113.156684",
"RoomStyleLat":"23.063305",
"RoomStyleSize":"58",
"RoomStyleHall":"1",
"RoomStyleRoom":"1",
"RoomStyleToilet":"1",
"RoomStyleEquipage":[
"无线WIFI",
"二十四小时热水",
"二十四小时小时监控",
"床上用品",
"冰箱",
"电视",
"二十四小时小时保安值守",
"空调",
"停车场",
"前台问询"
],
"RoomStylePlan":[
{
"duration":"12",
"price":"2720",
"discount":"0.95",
"total":"2584"
},
{
"duration":"11",
"price":"2750",
"discount":"0.95",
"total":"2613"
},
{
"duration":"10",
"price":"2780",
"discount":"0.95",
"total":"2641"
},
{
"duration":"9",
"price":"2800",
"discount":"0.95",
"total":"2660"
},
{
"duration":"8",
"price":"2830",
"discount":"0.95",
"total":"2689"
},
{
"duration":"7",
"price":"2860",
"discount":"0.95",
"total":"2717"
},
{
"duration":"6",
"price":"3150",
"discount":"0.95",
"total":"2993"
},
{
"duration":"5",
"price":"3290",
"discount":"0.95",
"total":"3126"
},
{
"duration":"4",
"price":"3430",
"discount":"0.95",
"total":"3259"
},
{
"duration":"3",
"price":"3580",
"discount":"0.95",
"total":"3401"
},
{
"duration":"2",
"price":"3720",
"discount":"0.95",
"total":"3534"
},
{
"duration":"1",
"price":"3860",
"discount":"0.95",
"total":"3667"
}
],
"RoomStyleMemo":"2513酒店公寓",
"RoomStyleCItyID":"29",
"RoomStyleProvince":"广东省",
"RoomStyleCIty":"佛山市",
"RoomStyleCounty":"南海区",
"DayDeposit":"100",
"Roomlongrentom":"105",
"RoomStyleImage":[
"./uploadimages/59488cab6c39b.jpg",
"./uploadimages/59488cae23476.jpg",
"./uploadimages/59488cb110cb8.jpg",
"./uploadimages/59488cb3ef3cb.jpg"
],
"Brand":{
"Brandid":"4",
"Brandname":"2513酒店公寓",
"Brandmemo":"2513酒店公寓",
"Brandimage":"./uploadimages/5948e73f7f744.png",
"Brandbigimage":"./uploadimages/5948e72801409.jpg",
"Brandminiimage":"./uploadimages/5948e738cc353.png",
"":"./uploadimages/5948e746c84b4.png"
},
"Unitprice":"218",
"RoomStar":"5",
"evaluate":"10",
"RoomServerManager":{
"ServerManagerId":"16",
"ServerManagerImage":"./uploadimages/58b0f4e08c3f0.png",
"ServerManagerName":"吴柯丽",
"ServerManagerPhoneNumber":"18675739089",
"ServerManagerMemo":"南海管家"
}
}]

这样的json数据就只是需要几个属性,不用全部拿取,所以原生解析可以很快取得,Gson要实体类多,但是可以很快取得数据,还有让代码简洁。

以下附上Gson解析json的例子传送门:http://blog.csdn.net/tkwxty/article/details/34474501/

(2)原生解析-----》optJSONObject

private void postRxFooterData_1(final String PhoneNumber, final String StyleId, final String Duration) {
Subscription subscription = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
RequestBody formBody = new FormEncodingBuilder()
.add("PhoneNumber",PhoneNumber)
.add("StyleId",StyleId)
.add("Duration",Duration)
.add("Relet","1")
.build(); final Request request = new Request.Builder()
.url(Common.NEW_Makeorders)
.post(formBody)
.build(); Call call = client.newCall(request);
try {
Response response = call.execute();
subscriber.onNext(response.body().string());
subscriber.onCompleted();
} catch (IOException e) {
e.printStackTrace();
}
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
} @Override
public void onError(Throwable e) {
} @Override
public void onNext(String s) {
//
try {
JSONObject arr2 = new JSONObject(s);
String dizhi2 = arr2.optString("styleadd");
String styletitle = arr2.optString("styletitle");
String styleprice = arr2.optString("styleprice");//房租
String total = arr2.optString("total");//优惠券抵扣
String handle = arr2.optString("handle");//应付
String wallet = arr2.optString("wallet");//钱包
fengge.setText(styletitle);
dizhi.setText(dizhi2);
fangzhu.setText("¥" + styleprice + "/日");
yingfu.setText("应付房租:¥" + handle);
heji.setText("合计:¥" + total);
qianbao.setText("钱包抵扣:¥"+wallet);
youjui.setText("优惠卷抵扣:¥0.0");
} catch (JSONException e) {
e.printStackTrace();
} } });
mCompositeSubscription.add(subscription);
}

两者的区别

//使用getJSONObject时,如果返回的对象不是JSONObject,抛出JSONException异常
/**
* Returns the value mapped by {@code name} if it exists and is a {@code
* JSONObject}.
* @throws JSONException if the mapping doesn't exist or is not a {@code
* JSONObject}.
*/ public JSONObject getJSONObject(String name) throws JSONException {
Object object = get(name);
if (object instanceof JSONObject) {
return (JSONObject) object;
} else {
throw JSON.typeMismatch(name, object, "JSONObject");
}
} //使用optJSONObject时,当返回结果不是JSONObject时,这里不会抛异常,而是返回null
/**
* Returns the value mapped by {@code name} if it exists and is a {@code
* JSONObject}. Returns null otherwise.
*/
public JSONObject optJSONObject(String name) {
Object object = opt(name);
return object instanceof JSONObject ? (JSONObject) object : null;
}

最新文章

  1. iOS开发——高级篇——二维码的生产和读取
  2. [转]Django与遗留系统和数据库集成
  3. Word转图片(使用Spire.doc)
  4. AutoCAD .NET二次开发(四)
  5. 备份U盘分区表,未雨绸缪
  6. C++编程思想重点笔记(上)
  7. ASP.NET Webform和ASP.NET MVC的区别
  8. JSON 教程学习进度备忘
  9. Lucene/ElasticSearch 学习系列 (1) 为什么学,学什么,怎么学
  10. Java [Leetcode 155]Min Stack
  11. Codeforces Round #330 (Div. 2)D. Max and Bike 二分 物理
  12. [LeetCode] 73. Set Matrix Zeroes 解题思路
  13. 设计模式模式适配器(Adapter)摘录
  14. maven settings.xml--需要保存到用户/.m2文件夹下
  15. python获取windows信息
  16. pod 使用详解
  17. pipreqs 组件
  18. MySQL:常用的数据模型
  19. 魔豆love移植
  20. centos 下修改mysql 默认字符集

热门文章

  1. 转:进程上下文VS中断上下文
  2. Cesium官方教程13--Cesium和Webpack
  3. Chsh- Linux必学的60个命令
  4. 全栈之路-微信小程序-架构总览
  5. Tomcat--远程Debug以及参数配置调优
  6. css的书写位置+元素分类
  7. R语言画图教程之盒形图
  8. 一句代码上传MultipartFile图片到指定文件夹
  9. GUID 使用方法
  10. Leetcode559.Maximum Depth of N-ary TreeN叉树的最大深度