关于android原生使用Json解析

什么是json

  • json是一种与开发语言无关的、轻量级的数据格式。全称JavaScript Object Notation.

  • 优点: 易于人的阅读和编写,易于程序解析与生产

  • 一个简单的JSON样例

      {
          "name":"JSON快速入门(java版本)",
          "autor":"李广",
          "content":["JSON基础入门","常用JSON处理"],
          "time":{
              "value":30,
              "unit":"分钟"
              }
       }
    
  • 数据结构-Object

    使用花括号{}包含的键值对结构,key必须是string类型,value为任何基本类型数据结构

  • 数据结构-Array

    使用中括号[]来起始,并用逗号,来分隔元素

  • json例子

    { 
      "name":"王小二",
      "age":25.2,
      "birthday":"1992-11-01",
      "school":"蓝翔",
      "major":["理发","挖掘机"],
      "has_girlfriend":false,
      "car":null,
      "house":null,
      "comment":"这是一个注释"
      }
    
    
      1)Android原生技术
      
      特点:编程相对麻烦,但是是Google官方提供的,有些JSON数据必须要Android原生技术来解析。Google官方没有提供将Java转换成json数据的API
      数据之间转换:
      (1)将JSON格式的字符串{}转换成Java对象
      API:JSONObject(String json):将json字符串解析为json对象
      Xxx getXxx (String name):根据name,在.json对象中得到对应的value
      Xxx optXxx (String json):根据name,在.json对象中得到对应的value
      get和opt的区别而:optXxx会在对应的key中的值不存在的时候返回一个空字符串或者你指定的默认值,而getString会出现空指针异常的错误
      
      (2)将JSON格式的字符串[]转换成Java对象的List
      API:JSONArray(String json):将json字符串解析为json数组
      int length ():得到json数组中元素的个数
      Xxx getXxx (String name):根据name,在.json对象中得到对应的value
      Xxx optXxx (String json):根据name,在.json对象中得到对应的value
      get和opt的区别而:optXxx会在对应的key中的值不存在的时候返回一个空字符串或者你指定的默认值,而getString会出现空指针异常的错误
      (3)复杂json的数据解析
      (4)特殊json的数据解析
    

效果

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 + '\'' +
                    '}';
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • # 概念JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于阅读和...
    耳东CY阅读 15,154评论 0 3
  • Spark SQL, DataFrames and Datasets Guide Overview SQL Dat...
    Joyyx阅读 8,282评论 0 16
  • 秋天是婉约的 丝丝凉意冲淡了炎热的暑气 树叶在光影中摆动 闪闪的被阳光照射的透亮 心中的风景无法掩饰 一抹青山叠翠...
    立涛阅读 527评论 0 0
  • 由于项目要求,最近学习了一个被称为 “Android第一神器” 的东西——Xposed,我们看下百度介绍:Xpo...
    leonseven阅读 1,850评论 0 4