JSON解析之原生解析

JSON解析之原生解析

  JSON是首先一种数据结构,说白了就是对数据的描述,刚刚出现是为了取代XML可惜并没有,但是在做为配置文件上,却是很好,由于它小巧灵活
  描述数据很好,所以在网络上进行数据传输更加方便
  • 请记住JSON对数据的描述形式,既然是形式,那么它的数据形式是什么样的:
    • 对象的描述是: {}
    • 数组的描述是: []
    • 属性或值的描述是: “”
    • 连接之间的描述是: :

比如 :

{
        "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数组进行解析

  1. 首先我们准备工作

    • 数据接口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,工具发到这里

  2. 那就编码吧

    ——–进行解析时,我们会要对JSON进行解析,得到javaBean对象,在使用json.jar的api进行代码解析,这是总体思路,但是我想我说的是javaBean对象,我目前不使用JsonFormat,GsonFormat等这些扫插件工具,而是手动创建javaBean对象,因为我们懂得如何手动创建javaBean对象,就可以在工具出问题的时候,自己解决,而不是不知道怎样办,工具并不是完美的,它也会出错的!


  • 手动创建javaBean对象的看JSON数据,请记住:拿到一些JSON数据,首先看符号, 有个原则,从外到内看,看到{}这个是个对象,就创建对象,看到[]就创建数据,但是这里有个问题,看![{},{}],这个看,1. 创建一个List容器 2. 再看里面,{}就创建对象,说明这个容器的泛型就是这个对象

开始解析

  1. 发送api,看看返回的JSON数据

    http://www.tngou.net/api/top/classify

    这里写图片描述

  2. 用工具格式化数据
    这里写图片描述

  3. 仔细察看JSON数据结构,进行手动创建javaBean对象

    原则: {}: 创建对象  [] 创容器
    
public class Root {  //看格式化的数据{} 创建对象 

    private boolean status;  //里面第一个
    private List<Tngou> tngou; //里面第二个,看到[]创建容器,Tngou是泛型,{}就是对象,要创建

    public void setStatus(boolean status) {
        this.status = status;
    }

    public boolean getStatus() {
        return status;
    }
    public List<Tngou> getTngou() {
        return tngou;
    }

    public void setTngou(List<Tngou> 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<Tngou> 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数组尽量一致

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值