什么是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 + '\'' +
'}';
}
}