Android---3种Json解析方法+解析框架

1.传统json解析

AAA处是实体类,BBB处是json数据的String格式
其余绿色的地方就是json数据中的标签名

 private ArrayList<AAA> paser(String BBB) throws
     JSONException {

     ArrayList<AAA> list = new ArrayList<AAA>();

     JSONObject json;
     json = new JSONObject(str);
     int rtnCode = json.getInt("rtnCode");
     if (rtnCode == 0) {
     list = new ArrayList<MainChargingBean>();
     JSONArray jsonData = json.getJSONArray("a");
     for (int i = 0; i < jsonData.length(); i++) {
     JSONObject j = jsonData.getJSONObject(i);
     MainChargingBean mcb = new MainChargingBean();


     LatLng latLng = new LatLng(j.getDouble("b"),
     j.getDouble("c"));
     mcb.setName(j.getString("d"));
     mcb.setFast_num(j.getString("e"));
     mcb.setSlow_num(j.getString("f"));
     mcb.setPoi_jing(j.getDouble("g"));
     mcb.setPoi_wei(j.getDouble("h"));
     mcb.setCharge_cost(j.getString("i"));
     mcb.setCharge_cost_way(j.getString("j"));
     mcb.setStop_cost(j.getString("k"));
     mcb.setWork_open(j.getString("l"));
     mcb.setWork_close(j.getString("m"));
     mcb.setPosition(latLng);

     list.add(mcb);
     }

     }

     return list;
     }

2. Gson和Json 的自动解析

2.1

Gson ---官方推出的自动解析工具
FastJson ---- 号称最快的json解析工具

2.2

手写实体封装类(JavaBeen)的严格要求,这是Gson和FastJson通过反射解析成功的前提条件,AS通过GsonFormat可以自动完成实体类的封装。

2.3 实体类要求:

* 用于封装fastjson或者gson解析后的得到的结果类型
 * 在封装此类中有以下几点要求:
 * 1. 该类中的所有属性的名字必须是json字符串中key的名字
 * 2. 属性的类型,必须是key所对应的value的类型
 * 3. 该类中的所有属性必须是private,并且必须按要求提供getset方法
 * 4. 该类中必须提供无参,有参的构造方法
 */

2.4 Gson的使用方式

1.      将gson对应的jar包添加到工程的libs文件夹中,并且选择Add As Library方法将jar包添加到工程中使用
2.      根据json字符串创建一个JavaBean类文件(即自定义类文件)
3.      通过gson包中的Gson对象调用方法fromJson即可获取解析结果

2.5 FastJson的使用方式:


1. 将fastjson对应的jar包添加到工程的libs文件夹中,并且选择Add As Library方法将jar包添加到工程中使用
2.根据json字符串创建一个JavaBean类文件(即自定义类文件)
3.通过fastjson包中的JsonObject调用静态方法parseObject即可获取解析结果

3 Gson与FastJson简单实例

3.1异步任务和网络访问:

public class MyTextTask extends AsyncTask<String,Void,Gao> {

    /**
     *通过接口回调,用于数据的返回
     */
    publicinterface  DataCallback{
        void getData(Gao list);
    }

    DataCallback callback;

    public MyTextTask(DataCallbackcallback){
        this.callback = callback;
    }

    @Override
    protected Gao doInBackground(String... strings){
        try {
            HttpURLConnection conn =(HttpURLConnection) new URL(strings[0]).openConnection();
            conn.setRequestMethod("GET");
            conn.connect();
            if(conn.getResponseCode()== 200){
                InputStream is =conn.getInputStream();
                byte[] b = new byte[1024];
                int num = -1;
                StringBuilderbuilder = new StringBuilder();
                while((num =is.read(b))!=-1){
                    builder.append(new String(b,0,num));
                }

                String json  = builder.toString();

                /**
                 * 通过fastjson中的JSONObject对象调用
                 * parseObject方法即可实现json字符串的自动解析
                 * 参数:
                 * 1:要解析的字符串
                 * 2:字符串要解析成什么样类型的对象
                 *
                 */
           // Gao gao =com.alibaba.fastjson.JSONObject.parseObject(json,Gao.class);

                /**
                 * 使用Gson进行自动解析
                 */
                Gson gson = new Gson();
                Gao gao =gson.fromJson(json,Gao.class);

                return gao;
            }
        } catch (IOException e){
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Gao gao) {
        super.onPostExecute(gao);
        callback.getData(gao);
    }
}

3.2 测试引用:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(BundlesavedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        /**
         * 用于自动JSON解析数据返回测试
         */
    /*    new MyTextTask(newMyTextTask.DataCallback() {
            @Override
            public void getData(Gao list){
                List<Info> infos =list.getInfo();
               Log.i("===","====== gao infos "+infos.toString());
            }
       }).execute("http://www.h5151.com/ajax/hd_game/platform=2&compare=af9cd783af6a57e43edeb8bd54421d45");
*/
}
}

4 异步任务+接口回调+泛型+反射机制:

public class MyTextTask_Auto<T> extends AsyncTask<String,Void, T> {

    /**
     *定义接口回调,用于数据返回
     */
    publicinterface  DataCallback<T> {
        void getData(T t);
    }

    DataCallback callback;

    Class<T> cls;
    public MyTextTask_Auto(DataCallback callback,Class<T> cls){
        this.callback = callback;
        this.cls =cls;
    }



    @Override
    protected T doInBackground(String...strings) {
        try {
            HttpURLConnection conn =(HttpURLConnection) new URL(strings[0]).openConnection();
            conn.setRequestMethod("GET");
            conn.connect();
            if(conn.getResponseCode()==200){
                InputStream is =conn.getInputStream();
                byte[] b = new byte[1024];
                int num = -1;
                StringBuilderbuilder = new StringBuilder();
                while((num=is.read(b))!=-1){
                    builder.append(new String(b,0,num));
                }

                String json =builder.toString();
                /**
                 * 使用Gson进行自动解析
                 */
            return  new JsonUtils<T>().getData(json,cls);
            }
        } catch (IOException e){
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(T t) {
        super.onPostExecute(t);
        callback.getData(t);       //返回封装的对象
    }
}

测试引用

public class MainActivity extends Activity {

    @Override
    protected void onCreate(BundlesavedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**
         * 泛型对象接口封装+接口回调+JsonFormat实体类自动生成
         */
        new MyTextTask_Auto<GaoBean>(new MyTextTask_Auto.DataCallback<GaoBean>(){

            @Override
            public void getData(GaoBeangaoBean) {
               List<GaoBean.InfoBean> infos = gaoBean.getInfo();
                Log.i("====","===== gaoinfos " + infos.toString());
            }
        },GaoBean.class).execute("http://www.h5151.com/ajax/hd_game/platform=2&compare=af9cd783af6a57e43edeb8bd54421d45");


        new MyTextTask_Auto<GiftBean>(new MyTextTask_Auto.DataCallback<GiftBean>(){

            @Override
            public void getData(GiftBeangiftBean) {
               List<GiftBean.ResultBean> infos = giftBean.getResult();
                Log.i("====","====="+ infos.toString());
            }
        },GiftBean.class).execute("http://api.k780.com:88/?app=weather.future&weaid=1&&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值