關(guān)于android原生使用Json解析

什么是json

  • json是一種與開發(fā)語言無關(guān)的千所、輕量級的數(shù)據(jù)格式。全稱JavaScript Object Notation.

  • 優(yōu)點: 易于人的閱讀和編寫没宾,易于程序解析與生產(chǎn)

  • 一個簡單的JSON樣例

      {
          "name":"JSON快速入門(java版本)"凌彬,
          "autor":"李廣"沸柔,
          "content":["JSON基礎(chǔ)入門","常用JSON處理"]铲敛,
          "time":{
              "value":30褐澎,
              "unit":"分鐘"
              }
       }
    
  • 數(shù)據(jù)結(jié)構(gòu)-Object

    使用花括號{}包含的鍵值對結(jié)構(gòu),key必須是string類型伐蒋,value為任何基本類型數(shù)據(jù)結(jié)構(gòu)

  • 數(shù)據(jù)結(jié)構(gòu)-Array

    使用中括號[]來起始工三,并用逗號,來分隔元素

  • json例子

    { 
      "name":"王小二"先鱼,
      "age":25.2,
      "birthday":"1992-11-01",
      "school":"藍(lán)翔"俭正,
      "major":["理發(fā)","挖掘機(jī)"]型型,
      "has_girlfriend":false,
      "car":null,
      "house":null,
      "comment":"這是一個注釋"
      }
    
    
      1)Android原生技術(shù)
      
      特點:編程相對麻煩段审,但是是Google官方提供的,有些JSON數(shù)據(jù)必須要Android原生技術(shù)來解析闹蒜。Google官方?jīng)]有提供將Java轉(zhuǎn)換成json數(shù)據(jù)的API
      數(shù)據(jù)之間轉(zhuǎn)換:
      (1)將JSON格式的字符串{}轉(zhuǎn)換成Java對象
      API:JSONObject(String json):將json字符串解析為json對象
      Xxx getXxx (String name):根據(jù)name寺枉,在.json對象中得到對應(yīng)的value
      Xxx optXxx (String json):根據(jù)name,在.json對象中得到對應(yīng)的value
      get和opt的區(qū)別而:optXxx會在對應(yīng)的key中的值不存在的時候返回一個空字符串或者你指定的默認(rèn)值绷落,而getString會出現(xiàn)空指針異常的錯誤
      
      (2)將JSON格式的字符串[]轉(zhuǎn)換成Java對象的List
      API:JSONArray(String json):將json字符串解析為json數(shù)組
      int length ():得到j(luò)son數(shù)組中元素的個數(shù)
      Xxx getXxx (String name):根據(jù)name姥闪,在.json對象中得到對應(yīng)的value
      Xxx optXxx (String json):根據(jù)name,在.json對象中得到對應(yīng)的value
      get和opt的區(qū)別而:optXxx會在對應(yīng)的key中的值不存在的時候返回一個空字符串或者你指定的默認(rèn)值砌烁,而getString會出現(xiàn)空指針異常的錯誤
      (3)復(fù)雜json的數(shù)據(jù)解析
      (4)特殊json的數(shù)據(jù)解析
    

效果

xiaoguo.png

代碼:

    package com.junjie.jsondemo;
import android.os.Handler;
import android.os.Message;
import android.provider.DocumentsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;

import com.junjie.jsondemo.adapter.NewsAdapter;
import com.junjie.jsondemo.entity.Tngou;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.xml.sax.helpers.LocatorImpl;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity {
private Handler mHandler;
private List<Tngou> tngouList;
private ListView listView;
private NewsAdapter newsAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    listView = (ListView) findViewById(R.id.lv_list);
    mHandler = new Handler(new InnerCallBack());
    tngouList =new ArrayList<>();
    newsAdapter =new NewsAdapter(this,tngouList);
    listView.setAdapter(newsAdapter);

}

public void doClick(View v) {
    String url = "http://www.tngou.net/api/top/classify";
    OkHttpClient okHttpClient = new OkHttpClient();
    Request request = new Request.Builder().url(url).build();

    okHttpClient.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {

        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            Message message = new Message();
            message.what = 0;
            String string = response.body().string();
            message.obj = string;
            mHandler.sendMessage(message);
        }
    });
}


private class InnerCallBack implements Handler.Callback {
    @Override
    public boolean handleMessage(Message msg) {
        if (msg.what == 0) {
            String content = (String) msg.obj;
            analysisJsonContent(content);
        }
        return false;
    }
}

/**
 * 解析json
 *
 * @param content
 */
private void analysisJsonContent(String content) {
    try {
        List<Tngou> tngous =new ArrayList<>();
        JSONObject rootObject = new JSONObject(content);
        boolean status = rootObject.getBoolean("status");
        JSONArray tngou = rootObject.getJSONArray("tngou");
        Tngou tngou1 =null;
        for (int i = 0; i < tngou.length(); i++) {
             tngou1 = new Tngou();
            JSONObject jsonObject = tngou.getJSONObject(i);
            tngou1.setDescription(jsonObject.getString("description"));
            tngou1.setTitle(jsonObject.getString("title"));
            tngou1.setId(jsonObject.getInt("id"));
            tngou1.setKeywords(jsonObject.getString("keywords"));
            tngou1.setName(jsonObject.getString("name"));
            tngou1.setSeq(jsonObject.getInt("seq"));
            tngous.add(tngou1);
        }
        tngouList.clear();
        tngouList.addAll(tngous);
        newsAdapter.notifyDataSetChanged();
    } catch (JSONException e) {
        e.printStackTrace();
    }


}

}

adapter中

package com.junjie.jsondemo.adapter;
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.junjie.jsondemo.R;
import com.junjie.jsondemo.entity.Tngou;

import java.util.List;

public class NewsAdapter extends BaseAdapter<Tngou> {
    public NewsAdapter(Context context, List<Tngou> list) {
        super(context, list);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (viewHolder == null) {
            viewHolder = new ViewHolder();
            convertView = getInflater().inflate(R.layout.item_news_list, null);
            viewHolder.tvId = (TextView) convertView.findViewById(R.id.tv_id);
            viewHolder.tvDescription = (TextView) convertView.findViewById(R.id.tv_description);
            viewHolder.tvKeywords = (TextView) convertView.findViewById(R.id.tv_keywords);
            viewHolder.tvName = (TextView) convertView.findViewById(R.id.tv_name);
            viewHolder.tvSeq = (TextView) convertView.findViewById(R.id.tv_seq);
            viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        Tngou tngou = getList().get(position);
        viewHolder.tvTitle.setText(tngou.getTitle());
        viewHolder.tvDescription.setText(tngou.getDescription());
        viewHolder.tvName.setText(tngou.getName());
        viewHolder.tvId.setText(tngou.getId() + "");
        viewHolder.tvSeq.setText(tngou.getSeq() + "");
        viewHolder.tvKeywords.setText(tngou.getKeywords());
        return convertView;
    }

    class ViewHolder {
        TextView tvId;
        TextView tvDescription;
        TextView tvKeywords;
        TextView tvName;
        TextView tvSeq;
        TextView tvTitle;
    }


}



    package com.junjie.jsondemo.adapter;
    import android.content.Context;
    import android.view.LayoutInflater;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public abstract class BaseAdapter<T> extends android.widget.BaseAdapter {
    
        private Context context;
        private LayoutInflater inflater;
        private List<T> list;
    
        public BaseAdapter(Context context, List<T> list) {
            this.context = context;
            setList(list);
            inflater = LayoutInflater.from(context);
    
        }
    
        public LayoutInflater getInflater() {
            return inflater;
        }
    
        public List<T> getList() {
            return list;
        }
    
    
        public void setList(List<T> list) {
            if (list == null) {
                list = new ArrayList<>();
            }
            this.list = list;
        }
    
        @Override
        public int getCount() {
            return list.size();
        }
    
        @Override
        public Object getItem(int position) {
            return null;
        }
    
        @Override
        public long getItemId(int position) {
            return 0;
        }
    
    }

實體類

    package com.junjie.jsondemo.entity;
    
    
    public class Tngou {
        private String description;
        private int id;
        private String keywords;
        private String name;
        private int seq ;
        private String title;
    
        public String getDescription() {
            return description;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getKeywords() {
            return keywords;
        }
    
        public void setKeywords(String keywords) {
            this.keywords = keywords;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getSeq() {
            return seq;
        }
    
        public void setSeq(int seq) {
            this.seq = seq;
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        @Override
        public String toString() {
            return "Tngou{" +
                    "description='" + description + '\'' +
                    ", id=" + id +
                    ", keywords='" + keywords + '\'' +
                    ", name='" + name + '\'' +
                    ", seq=" + seq +
                    ", title='" + title + '\'' +
                    '}';
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筐喳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子函喉,更是在濱河造成了極大的恐慌避归,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件管呵,死亡現(xiàn)場離奇詭異梳毙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)捐下,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門账锹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坷襟,你說我怎么就攤上這事奸柬。” “怎么了婴程?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵廓奕,是天一觀的道長。 經(jīng)常有香客問我,道長懂从,這世上最難降的妖魔是什么授段? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮番甩,結(jié)果婚禮上侵贵,老公的妹妹穿的比我還像新娘。我一直安慰自己缘薛,他們只是感情好窍育,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宴胧,像睡著了一般漱抓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恕齐,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天乞娄,我揣著相機(jī)與錄音,去河邊找鬼显歧。 笑死仪或,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的士骤。 我是一名探鬼主播范删,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拷肌!你這毒婦竟也來了到旦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤巨缘,失蹤者是張志新(化名)和其女友劉穎添忘,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體若锁,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡搁骑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拴清。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靶病。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡会通,死狀恐怖口予,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涕侈,我是刑警寧澤沪停,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響木张,放射性物質(zhì)發(fā)生泄漏众辨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一舷礼、第九天 我趴在偏房一處隱蔽的房頂上張望鹃彻。 院中可真熱鬧,春花似錦妻献、人聲如沸蛛株。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谨履。三九已至,卻和暖如春熬丧,著一層夾襖步出監(jiān)牢的瞬間笋粟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工析蝴, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留害捕,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓嫌变,卻偏偏與公主長得像吨艇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子腾啥,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理东涡,服務(wù)發(fā)現(xiàn),斷路器倘待,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • # 概念JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式疮跑。 易于閱讀和...
    小蕓論閱讀 15,285評論 0 3
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    Joyyx閱讀 8,328評論 0 16
  • 秋天是婉約的 絲絲涼意沖淡了炎熱的暑氣 樹葉在光影中擺動 閃閃的被陽光照射的透亮 心中的風(fēng)景無法掩飾 一抹青山疊翠...
    立濤閱讀 559評論 0 0
  • 由于項目要求,最近學(xué)習(xí)了一個被稱為 “Android第一神器” 的東西——Xposed凸舵,我們看下百度介紹:Xpo...
    leonseven閱讀 1,878評論 0 4