27
2017
09

Android https-json解析

Android https-json解析示例效果

截图

上截图看效果:
这里写图片描述

全部代码

package com.example.administrator.model.cesi;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.example.administrator.model.R;
import com.example.administrator.model.net.https.HttpUtils;
import com.example.administrator.model.net.https.HttpsClientHelper;

/** * 通过接口,获取网络的信息,然后经过JSON解析,显示在屏幕上。 * 方法一: * * @author Administrator */
public class TestNet extends Activity implements OnClickListener {
    private EditText editText;
    private Button button;
    private TextView textView;
    private final int SUCCESS = 1;
    private final int FAILURE = 0;
    private final int ERRORCODE = 2;
    protected String weatherResult;
    HttpsClientHelper https;


    private Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SUCCESS:
                    /** * 获取信息成功后,对该信息进行JSON解析,得到所需要的信息,然后在textView上展示出来。 */
                    try {
                        Toast.makeText(TestNet.this, "获取数据成功", Toast.LENGTH_SHORT).show();
                        JSONAnalysis(msg.obj.toString());
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                    break;

                case FAILURE:
                    Toast.makeText(TestNet.this, "获取数据失败", Toast.LENGTH_SHORT)
                            .show();
                    break;

                case ERRORCODE:
                    Toast.makeText(TestNet.this, "获取的CODE码不为200!",
                            Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
            }
        }

        ;
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_net);
        /** * 初始化 */
        init();
    }

    private void init() {
        https = new HttpsClientHelper();
        editText = (EditText) findViewById(R.id.editText);
        button = (Button) findViewById(R.id.button);
        textView = (TextView) findViewById(R.id.show_text);
        button.setOnClickListener(this);
    }

    /** * JSON解析方法 */
    protected void JSONAnalysis(String string) throws JSONException {
        JSONObject object = null;
        String[] str1 = new String[10000];
        String[] str2 = new String[10000];
        String[] str3 = new String[10000];
        String[] str4 = new String[10000];
        String[] str5 = new String[10000];
        String[] str6 = new String[10000];
        String[] str7 = new String[10000];
        try {
            JSONArray jsonArray = new JSONArray(string);
            StringBuilder builder = new StringBuilder();
            textView.setText("数据:" + builder.toString());
            for (int i = 0; i < jsonArray.length(); i++) {
                //新建一个JSON对象,该对象是某个数组里的其中一个对象
                JSONObject jsonObject2 = (JSONObject) jsonArray.getJSONObject(i);
                str1[i] = jsonObject2.getString("stcd");
                str2[i] = jsonObject2.getString("stnm");
                str3[i] = jsonObject2.getString("stlc");
                str4[i] = jsonObject2.getString("stcd");
                str5[i] = jsonObject2.getString("canalcode");
                str6[i] = jsonObject2.getString("sttp");
                str7[i] = jsonObject2.getString("lgtd");
            }
// https.JSONAnalysis(string);
            for (int j = 0; j < jsonArray.length(); j++) {
                textView.setText("数据:\n" + "城市:" + str1[j] + "\n日期:" + str2[j] + "\n星期:" + str3[j]
                        + "\n温度:" + str5[j] + "\n天气情况:" + str6[j] + "\n穿衣指数:" + str7[j]);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button:
                /** * 点击按钮事件,在主线程中开启一个子线程进行网络请求 * (因为在4.0只有不支持主线程进行网络请求,所以一般情况下,建议另开启子线程进行网络请求等耗时操作)。 */
                new Thread() {
                    public void run() {
                        int code;
                        try {
                            String path = editText.getText().toString();
                            URL url = new URL(path);
                            /** * 这里网络请求使用的是类HttpURLConnection,另外一种可以选择使用类HttpClient。 */
                            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                            conn.setRequestMethod("GET");//使用GET方法获取
                            conn.setConnectTimeout(5000);
                            code = conn.getResponseCode();
                            if (code == 200) {
                                /** * 如果获取的code为200,则证明数据获取是正确的。 */
                                InputStream is = conn.getInputStream();
                                String result = HttpUtils.readMyInputStream(is);

                                /** * 子线程发送消息到主线程,并将获取的结果带到主线程,让主线程来更新UI。 */
                                Message msg = new Message();
                                msg.obj = result;
                                msg.what = SUCCESS;
                                handler.sendMessage(msg);

                            } else {

                                Message msg = new Message();
                                msg.what = ERRORCODE;
                                handler.sendMessage(msg);
                            }
                        } catch (Exception e) {

                            e.printStackTrace();
                            /** * 如果获取失败,或出现异常,那么子线程发送失败的消息(FAILURE)到主线程,主线程显示Toast,来告诉使用者,数据获取是失败。 */
                            Message msg = new Message();
                            msg.what = FAILURE;
                            handler.sendMessage(msg);
                        }
                    }

                    ;
                }.start();
                break;

            default:
                break;
        }
    }

}  

核心代码

  /** * JSON解析方法 */
    protected void JSONAnalysis(String string) throws JSONException {
        JSONObject object = null;
        String[] str1 = new String[10000];
        String[] str2 = new String[10000];
        String[] str3 = new String[10000];
        String[] str4 = new String[10000];
        String[] str5 = new String[10000];
        String[] str6 = new String[10000];
        String[] str7 = new String[10000];
        try {
            JSONArray jsonArray = new JSONArray(string);
            StringBuilder builder = new StringBuilder();
            textView.setText("数据:" + builder.toString());
            for (int i = 0; i < jsonArray.length(); i++) {
                //新建一个JSON对象,该对象是某个数组里的其中一个对象
                JSONObject jsonObject2 = (JSONObject) jsonArray.getJSONObject(i);
                str1[i] = jsonObject2.getString("stcd");
                str2[i] = jsonObject2.getString("stnm");
                str3[i] = jsonObject2.getString("stlc");
                str4[i] = jsonObject2.getString("stcd");
                str5[i] = jsonObject2.getString("canalcode");
                str6[i] = jsonObject2.getString("sttp");
                str7[i] = jsonObject2.getString("lgtd");
            }
// https.JSONAnalysis(string);
            for (int j = 0; j < jsonArray.length(); j++) {
                textView.setText("数据:\n" + "城市:" + str1[j] + "\n日期:" + str2[j] + "\n星期:" + str3[j]
                        + "\n温度:" + str5[j] + "\n天气情况:" + str6[j] + "\n穿衣指数:" + str7[j]);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

json解析简介与说明

简介

json官网:http://json.org。(json的jar包请移步json官网下载)
JSON:JavaScript 对象表示法(JavaScript Object Notation)。独立于语言和平台,比 XML 更小、更快,更易解析。如今JSON数据已经成为了互联网中大多数数据的传递方式,所以必须要熟练掌握。
Android平台自带了JSON解析的相关API,可以将文件、输入流中的数据转化为JSON对象,然后从对象中获取JSON保存的数据内容。

Android的JSON解析部分都在包org.json下,主要有以下几个类:
JSONObject:可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。它对外部(External:应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{“JSON”: “Hello, World”},最外被大括号包裹,其中的Key和Value被冒号”:”分隔)。其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put(“JSON”, “Hello, World!”),在Key和Value之间是以逗号”,”分隔。Value的类型包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。

JSONStringer:json文本构建类 ,根据官方的解释,这个类可以帮助快速和便捷的创建JSON text。其最大的优点在于可以减少由于 格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。

JSONArray:它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:[value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为,get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。

JSONTokener:json解析类
JSONException:json中用到的异常

常用json接口格式

网址:http://www.bejson.com/knownjson/webInterface/

一般格式

JSON返回示例:
一:
{ /*JSONObject*/
    "resultcode": "200",
    "reason": "SUCCESSED!",
    "result": [ /*JSONArray*/
        { /*JSONObject*/
            "city": "苏州",  /*城市*/
            "PM2.5": "73",  /*PM2.5指数*/
            "AQI": "98",    /*空气质量指数*/
            "quality": "良", /*空气质量*/
            "PM10": "50",/*PM10*/
            "CO": "0.79",  /*一氧化碳*/
            "NO2": "65",  /*二氧化氮*/
            "O3": "28",    /*臭氧*/
            "SO2": "41",  /*二氧化硫*/
            "time": "2014-12-26 11:48:40"/*更新时间*/  
        }
    ],
    "error_code": 0
}

二:

[
    {
    "stcd":"00001635",
    "stnm":"黄金渠首流量站",
    "stlc":"丰城市荷湖乡黄金水库出水口",
    "canalcode":"A003",
    "sttp":"ZZ",
    "lgtd":115.74,"lttd":27.9,
    "starttime":"","preq":11.0,
    "plevel":2.0,"rlevel":2.0 },
]

说明:对于第二种没有给出result字段的json

直接 JSONArray jsonArr = new JSONArray(string);
然后 
for(int i=0; i<jsonArr.length(); i++){ JSONObject jsonObj = jsonArr.getJSONObject(i); jsonObj.getXXX........ }

json用法

初始化:

     //初始化JSONObject 方法一 
        JSONObject jsonObject1 = new JSONObject();  
        jsonObject1.put("Name", "Tom");  
        jsonObject1.put("age", "11");  

        //初始化JSONObject 方法二 
        JSONObject jsonObject2 = new JSONObject("{'Name':'Tom','age':'11'}");  

        //初始化JSONArray 方法一 
        JSONArray jsonArray1 = new JSONArray();  
        jsonArray1.put("abc");  
        jsonArray1.put("xyz");  

        //初始化JSONArray 方法二 
        JSONArray jsonArray2 = new JSONArray("['abc','xyz']");  

JSONObject、JSONArray相互嵌套相互嵌套

   JSONObject jsonObject = new JSONObject("{'Name':'Tom','age':'11'}");  
        JSONArray jsonArray = new JSONArray("['abc','xyz']");  

        //JSONObject内嵌JSONObject 
        JSONObject jsonObject1 = new JSONObject();  
        jsonObject1.put("object1", jsonObject);  
        jsonObject1.put("object2", jsonObject);  

        //JSONObject内嵌JSONArray 
        JSONObject jsonObject2 = new JSONObject();  
        jsonObject2.put("JSONArray1", jsonArray);  
        jsonObject2.put("JSONArray2", jsonArray);  

        //JSONArray内嵌JSONArray 
        JSONArray jsonArray1 = new JSONArray();  
        jsonArray1.put(jsonArray);  
        jsonArray1.put(jsonArray);  

        //JSONArray内嵌JSONObject 
        JSONArray jsonArray2 = new JSONArray();  
        jsonArray2.put(jsonObject);  
        jsonArray2.put(jsonObject);  

json解析

        //解析字符串 
        JSONObject jsonObject1 = new JSONObject();  
        jsonObject1.put("Name", "Tom");  
        jsonObject1.put("age", "11");  
        System.out.println("解析字符串:" + "\r" + jsonObject1.getString("Name"));  

        //解析对象 
        JSONObject jsonObject = new JSONObject("{'Name':'Tom','age':'11'}");  
        JSONObject jsonObject2 = new JSONObject();  
        jsonObject2.put("jsonObject", jsonObject);  
上一篇:XCode9变化 下一篇:android全局替换字体最新方案