json原生解析
身为新手,在运用网络解析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; }