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

json原生解析的更多相关文章

  1. Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示

    Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示 今天项目中要实现一个天气的预览,加载的信息很多,字段也很多,所以理清了一下思路,准备独立出来写一个总结,这样对大家 ...

  2. Delphi XE6 原生解析json

    Delphi XE5带了system.json单元,原生提供了json支持类.下面是解析json用法说明: 最简单的JSON大致像这样 { "date":"周二(今天, ...

  3. Android原生生成JSON与解析JSON

    JSON数据是一种轻量级的数据交换格式,在Android中通常应用于client与server交互之间的传输数据.像如今在网上有非常多解析JSON数据的jar包,可是归根究竟用的都是Android原生 ...

  4. iOS - JSON 数据解析

     iOS - JSON 数据解析 前言 NS_CLASS_AVAILABLE(10_7, 5_0) @interface NSJSONSerialization : NSObject @availab ...

  5. iOS开发笔记3:XML/JSON数据解析

    这篇主要总结在iOS开发中XML/JSON数据解析过程用到的方法.XML数据解析主要使用SAX方式的NSXMLParser以及DOM方式的GDataXML,JSON数据解析主要使用NSJSONSeri ...

  6. 《JAVASCRIPT高级程序设计》JSON语法/解析/序列化

    JSON是一种数据格式,不是一种编程语言. 一.语法 JSON语法可以表示以下三种类型的值:简单值.对象.数组. 1.简单值 最简单的JSON数据值就是简单值: 5 "hello world ...

  7. 关于iOS中几种第三方对XML/JSON数据解析的使用

    Json XML 大数据时代,我们需要从网络中获取海量的新鲜的各种信息,就不免要跟着两个家伙打交道,这是两种结构化的数据交换格式.一般来讲,我们会从网络获取XML或者Json格式的数据,这些数据有着特 ...

  8. JMeter 插件 Json Path 解析 HTTP 响应 JSON 数据(转)

    JMeter 是一个不错的负载和性能测试工具,我们也用来做 HTTP API 接口测试.我们的 API 返回结果为 JSON 数据格式.JSON 简介,JSON 教程. JSON 已经成为数据交换格式 ...

  9. plist文件、NSUserDefault 对文件进行存储的类、json格式解析

    ========================== 文件操作 ========================== Δ一 .plist文件 .plist文件是一个属性字典数组的一个文件: .plis ...

随机推荐

  1. nginx源码分析——内存池

    内存池的目的就是管理内存,使回收内存可以自动化一些. ngx_palloc.h /* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. * ...

  2. 图片转成base64 跨域等安全限制及解决方案

    把其他域的图片在canvas中转换为base64时,会遇到跨域安全限制. 目前,唯一可行的方案是,把图片文件以arraybuffer的形式ajax下载下来,然后直接转base4. 但是,这样有个毛病, ...

  3. 《DSP using MATLAB》Problem 8.12

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  4. axis2开发webservice接口入门到精通详解(转)

    最近在开发接口,在网上发现了两篇不错的文章,给大家分享下: 第一篇: 一.Axis2的下载和安装 1.可从http://ws.apache.org/axis2/ 下载Axis2的最新版本:      ...

  5. Quota- Linux必学的60个命令

    1.作用 quota命令用来显示磁盘使用情况和限制情况,使用权限超级用户. 2.格式 quota [-g][-u][-v][-p] 用户名 组名 3.参数 -g:显示用户所在组的磁盘使用限制. -u: ...

  6. Odoo 新 API 概述

    __all__ = [ 'Environment', 'Meta', 'guess', 'noguess', 'model', 'multi', 'one', 'cr', 'cr_context', ...

  7. csp-s模拟测试51(b)attack,tree题解

    题面:https://www.cnblogs.com/Juve/articles/11598286.html attack: 支配树裸题? 看一下支配树是什么: 问题:我们有一个有向图(可以有环),定 ...

  8. 19-10-17-T

    真的T了.(滑稽 Final 35 Miemeng 100 03:12:51 0 03:12:54 15 03:12:55 115 03:12:55 幸好$T1$还能要,不然就…… 前言 中午$\sc ...

  9. 同名的cookie会不会存在多个

    cookie new了多个.同一个名字.会不会存在多个呢. //若果不设置Cookie的path,则名字相同的Cookie视为相同的Cookie,后面的覆盖前面的,注意:大小写敏感 Cookie c1 ...

  10. Linux 内存缓存占用过大,Centos7设置定时清除buff/cache的脚本

    Linux系统buff/cache 中缓存数据占用内存过高,定时清理buff/cache ,释放系统内存 root权限创建脚本文件: touch cleanCache.sh && vi ...