JSON是首先一种数据结构,说白了就是对数据的描述,刚刚出现是为了取代XML可惜并没有,但是在做为配置文件上,却是很好,由于它小巧灵活
描述数据很好,所以在网络上进行数据传输更加方便
比如 :
{
"description":"天狗实时事件:娱乐热点事件,娱乐热词排行 做最好的娱乐热点、热词提取;推送最新的娱乐实时事件,挖掘最新的娱乐热词。",
"id":2,
"keywords":"娱乐热点事件 娱乐热词排行 天狗实时事件",
"name":"娱乐热点",
"seq":2,
"title":"娱乐热点事件_娱乐热词排行-天狗实时事件"
}
表示: 首先有{}的描述,说明它是个对象, 再进行观察:里面都是 “Name”:”xiaoming”或”Name”:值, 这个表示如: description这个字段的描述是”天狗实时事件:娱乐热点事件,娱乐热词排行 做最好的娱乐热点、热词提取;推送最新的娱乐实时事件,挖掘最新的娱乐热词。” 接着id 为2 ,name为”娱乐热点” 说白了,就是这个对象就是对事件的描述,它的id是多少,关键字是什么,标题是什么,都会进行描述, 用java面向对象的思想来说,这就是个javaBean对象,对一个的对象属性的描述。
那么有多个对象在一起就成了数组对象,比如这种形式
[
{"name":"xiaomang"},{"name":"yaya"},
{"name","meimei"},{"name","youyou"}
]
上面就是一个数组对象,实际上的数据描述很复杂,不单单是2个字段,这里我只是做示范而已
以上就是对JSON的简单介绍,下面开始JSON的数据解析,这篇我只是对原生的JSON数组进行解析
首先我们准备工作
数据接口api,我用http://www.tngou.net/天狗的api,其实一开始我学习的时候,根本不知道什么是数据接口,也不知道http://www.tngou.net/给我一个网址是什么意思啊,也没有对我说,没办法自学,总是像瞎子一样,手上有什么都不知道是什么,更别说怎样用了,但是别忘记了,我们是有这个知识却不知道怎样用而已,一旦会了, 就比别人理解的更深入,现在知道了吧,一些人经常说的天气api,新闻api什么的吧,说白了,就是一个网址,你用http请求,它就会给我们一些数据,然后我们再进行解析。
我们有了接口api,进行数据请求,发现却是乱码的,看不清的,甚至数据看不懂的,也不知道是什么意思的数据,这是因为,数据我们没有格式化,我们当然看不懂了,那么我们现在就要对数据进行格式化,怎么做了,用工具, 把数据copy, 放到工具就好 ,网络上工具很多,最简单是就是在线JSON工具了,如http://json.cn/ 这个就可以
开发工具 这个看自己用什么了,我用的是IDEA java ,你也可以用eclpise,这个不用解释,既然看json解析,说明你至少学会一门高级语言了
解析包jar ,我这篇是用原生的JSON解析,所以我只用了json-20151123.jar,就可以了,文章最后我会把所有的jar,工具发到这里
那就编码吧
——–进行解析时,我们会要对JSON进行解析,得到javaBean对象,在使用json.jar的api进行代码解析,这是总体思路,但是我想我说的是javaBean对象,我目前不使用JsonFormat,GsonFormat等这些扫插件工具,而是手动创建javaBean对象,因为我们懂得如何手动创建javaBean对象,就可以在工具出问题的时候,自己解决,而不是不知道怎样办,工具并不是完美的,它也会出错的!
开始解析
发送api,看看返回的JSON数据
http://www.tngou.net/api/top/classify
用工具格式化数据
仔细察看JSON数据结构,进行手动创建javaBean对象
原则: {}: 创建对象 [] 创容器
public class Root { //看格式化的数据{} 创建对象
private boolean status; //里面第一个
private List tngou; //里面第二个,看到[]创建容器,Tngou是泛型,{}就是对象,要创建
public void setStatus(boolean status) {
this.status = status;
}
public boolean getStatus() {
return status;
}
public List getTngou() {
return tngou;
}
public void setTngou(List tngou) {
this.tngou = tngou;
}
}
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;
}
}
请求网络自然需要http
public class Utls {
private String url;
private Callback callback; //回调
public Utls(String url, Callback callback) {
this.url = url;
this.callback = callback;
}
public void getJson() {
new Thread() {
@Override
public void run() {
StringBuilder builder = new StringBuilder();
try {
URL u = new URL(url);
HttpURLConnection con = (HttpURLConnection) u.openConnection();
con.setRequestMethod("GET");
con.setReadTimeout(6000);
con.setConnectTimeout(6000);
con.connect();
if (con.getResponseCode() == 200) {
InputStream stream = con.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
String content = null;
while((content = br.readLine()) != null) {
builder.append(content);
}
br.close();
callback.showJson(builder.toString());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
public interface Callback { //简单的回调方法
void showJson(String content);
}
核心代码
public class Demo1 implements Callback {
public static void main(String[] args) {
Demo1 demo = new Demo1();
Utls u = new Utls("http://www.tngou.net/api/top/classify",demo);
u.getJson();
}
@Override
public void showJson(String content) {
这个是核心代码,我单独放到下面,请看
}
}
List tngous = new ArrayList<>();
//创建容器,由我们手动创建javaBean知道,要储存Tngou
JSONObject rootObject = new JSONObject(content);
// 使用JSONOBject接收JSON数据进行构造根object,在一层层遇到数组就使用getJSONArray方法,遇到对象就创建JSOOBject对象,进行储存在javaBean对象上
Root root = new Root();
root.setStatus(rootObject.getBoolean("status"));
JSONArray tngou = rootObject.getJSONArray("tngou");//得到数组,再一个个遍历
for (int i = 0; i < tngou.length(); i++) {
JSONObject object = tngou.getJSONObject(i);
Tngou t = new Tngou();
t.setTitle(object.getString("title"));
tngous.add(t);
}
root.setTngou(tngous);
System.out.println(root.getStatus());
for (Tngou tngou1 : root.getTngou()) {
System.out.println(tngou1.getTitle());
} //看到我们的解析结果
}
注意事项: 在手动创建javaBean对象时,数据字段要和JSON数组尽量一致