资讯专栏INFORMATION COLUMN

Android之JSON格式数据解析

taowen / 1645人阅读

摘要:如今数据已经成为了互联网中大多数数据的传递方式,所以必须要熟练掌握。它代表一组有序的数值。解析类中用到的异常下面以聚合数据空气质量城市空气指数数据接口为例来演示格式数据的解析。

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中用到的异常

下面以聚合数据空气质量城市空气PM2.5指数数据接口为例来演示JSON格式数据的解析。

聚合数据空气质量城市空气PM2.5指数数据接口API文档参见:https://www.juhe.cn/docs/api/...

JSON返回示例:

{
    "resultcode": "200",
    "reason": "SUCCESSED!",
    "result": [
        {
            "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
}

实例:JSONDemo
运行效果:

代码清单:
布局文件:activity_main.xml

  
  
      
  
          
  
        "  
      
  
    

Java源代码文件:MainActivity.java

package com.rainsong.jsondemo;  
  
import android.os.Bundle;  
import android.app.Activity;  
import android.view.Menu;  
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;  
  
public class MainActivity extends Activity {  
    EditText et_city;  
    Button btn_query;  
    TextView tv_result;  
    QueryTask task;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        et_city = (EditText)findViewById(R.id.city);  
        tv_result = (TextView)findViewById(R.id.result);  
        btn_query = (Button)findViewById(R.id.query);  
  
        btn_query.setOnClickListener(new OnClickListener() {  
            public void onClick(View view) {  
                String city = et_city.getText().toString();  
                if (city.length() < 1) {  
                    Toast.makeText(MainActivity.this, "请输入城市名",  
                            Toast.LENGTH_LONG).show();  
                    return;  
                }  
                task = new QueryTask(MainActivity.this, tv_result);  
                task.execute(city);  
            }  
        });  
    }  
  
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        // Inflate the menu; this adds items to the action bar if it is present.  
        getMenuInflater().inflate(R.menu.main, menu);  
        return true;  
    }  
  
} 

Java源代码文件:QueryTask.java

package com.rainsong.jsondemo;  
  
import java.io.IOException;  
import java.net.URLEncoder;  
import java.util.ArrayList;  
  
import org.apache.http.HttpResponse;  
import org.apache.http.NameValuePair;  
import org.apache.http.client.HttpClient;  
import org.apache.http.client.methods.HttpGet;  
import org.apache.http.impl.client.DefaultHttpClient;  
import org.apache.http.message.BasicNameValuePair;  
import org.apache.http.util.EntityUtils;  
import org.json.JSONArray;  
import org.json.JSONException;  
import org.json.JSONObject;  
  
import android.content.Context;  
import android.os.AsyncTask;  
import android.widget.TextView;  
import android.widget.Toast;  
  
public class QueryTask extends AsyncTask {  
    Context context;  
    TextView tv_result;  
  
    private static final String JUHE_URL_ENVIRONMENT_AIR_PM =   
                                    "http://web.juhe.cn:8080/environment/air/pm";  
    private static final String JUHE_APPKEY = "你申请的APPKEY值";  
  
    public QueryTask(Context context, TextView tv_result) {  
        // TODO Auto-generated constructor stub  
        super();  
        this.context = context;  
        this.tv_result = tv_result;   
    }  
  
    @Override  
    protected String doInBackground(String... params) {  
        String city = params[0];  
  
        ArrayList headerList = new ArrayList();  
        headerList.add(new BasicNameValuePair("Content-Type", "text/html; charset=utf-8"));  
  
        String targetUrl = JUHE_URL_ENVIRONMENT_AIR_PM;  
  
        ArrayList paramList = new ArrayList();  
        paramList.add(new BasicNameValuePair("key", JUHE_APPKEY));  
        paramList.add(new BasicNameValuePair("dtype", "json"));  
        paramList.add(new BasicNameValuePair("city", city));  
  
        for (int i = 0; i < paramList.size(); i++) {  
            NameValuePair nowPair = paramList.get(i);  
            String value = nowPair.getValue();  
            try {  
                value = URLEncoder.encode(value, "UTF-8");  
            } catch (Exception e) {  
            }  
            if (i == 0) {  
                targetUrl += ("?" + nowPair.getName() + "=" + value);  
            } else {  
                targetUrl += ("&" + nowPair.getName() + "=" + value);  
            }  
        }  
  
        HttpGet httpRequest = new HttpGet(targetUrl);  
        try {  
            for (int i = 0; i < headerList.size(); i++) {  
                httpRequest.addHeader(headerList.get(i).getName(),  
                                        headerList.get(i).getValue());  
            }  
  
            HttpClient httpClient = new DefaultHttpClient();  
  
            HttpResponse httpResponse = httpClient.execute(httpRequest);  
            if (httpResponse.getStatusLine().getStatusCode() == 200) {  
                String strResult = EntityUtils.toString(httpResponse.getEntity());  
                return strResult;  
            } else {  
                return null;  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return null;  
    }  
  
    @Override    
    protected void onPostExecute(String result) {  
        if (result != null) {  
            try {  
                JSONObject jsonObject = new JSONObject(result);  
                int resultCode = jsonObject.getInt("resultcode");  
                if (resultCode == 200) {  
                    JSONArray resultJsonArray = jsonObject.getJSONArray("result");  
                    JSONObject resultJsonObject = resultJsonArray.getJSONObject(0);  
                    String output = context.getString(R.string.city) + ": " + resultJsonObject.getString("city") + "
"  
                            + context.getString(R.string.PM25) + ": " + resultJsonObject.getString("PM2.5") + "
"  
                            + context.getString(R.string.AQI) + ": " + resultJsonObject.getString("AQI") + "
"  
                            + context.getString(R.string.quality) + ": " + resultJsonObject.getString("quality") + "
"  
                            + context.getString(R.string.PM10) + ": " + resultJsonObject.getString("PM10") + "
"  
                            + context.getString(R.string.CO) + ": " + resultJsonObject.getString("CO") + "
"  
                            + context.getString(R.string.NO2) + ": " + resultJsonObject.getString("NO2") + "
"  
                            + context.getString(R.string.O3) + ": " + resultJsonObject.getString("O3") + "
"  
                            + context.getString(R.string.SO2) + ": " + resultJsonObject.getString("SO2") + "
"  
                            + context.getString(R.string.time) + ": " + resultJsonObject.getString("time") + "
";  
                    tv_result.setText(output);  
                } else if (resultCode == 202) {  
                    String reason = jsonObject.getString("reason");  
                    tv_result.setText(reason);  
                } else {  
                    Toast.makeText(context, "查询失败",  
                            Toast.LENGTH_LONG).show();  
                    tv_result.setText("");  
                }  
            } catch (JSONException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        } else {  
            Toast.makeText(context, "查询失败",  
                                    Toast.LENGTH_LONG).show();  
            tv_result.setText("");  
        }  
    }    
    
}  

字符串资源:string.xml

  
  
  
    JSONDemo  
    Settings  
    Hello world!  
  
    城市  
    PM2.5指数  
    空气质量指数  
    空气质量  
    PM10  
    一氧化碳  
    二氧化氮  
    臭氧  
    二氧化硫  
    更新时间  
      
  

API知识点
public class
JSONObject
extends Object

org.json.JSONObject

Class Overview
A modifiable set of name/value mappings. Names are unique, non-null strings. Values may be any mix of JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL. Values may not be null, NaNs, infinities, or of any type not listed here.

JSONObject(String json)
Creates a new JSONObject with name/value mappings from the JSON string.

Object get(String name)
Returns the value mapped by name.

int getInt(String name)
Returns the value mapped by name if it exists and is an int or can be coerced to an int.

String getString(String name)
Returns the value mapped by name if it exists, coercing it if necessary.

JSONArray getJSONArray(String name)
Returns the value mapped by name if it exists and is a JSONArray.

public class
JSONArray
extends Object

org.json.JSONArray

Class Overview
A dense indexed sequence of values. Values may be any mix of JSONObjects, other JSONArrays, Strings, Booleans, Integers, Longs, Doubles, null or NULL. Values may not be NaNs, infinities, or of any type not listed here.

JSONObject getJSONObject(int index)

Returns the value at index if it exists and is a JSONObject.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/13178.html

相关文章

  • AndroidRetrofit详解(转载)

    摘要:说明该文章转载于前言在开发中,网络请求十分常用而在网络请求库中,是当下最热的一个网络请求库今天,我将献上一份非常详细的使用教程,希望你们会喜欢。说明:该文章转载于https://www.jianshu.com/p/a3e162261ab6 前言 在Andrroid开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库 image ...

    番茄西红柿 评论0 收藏0
  • Android开发短信验证码示例

    在说Android中的短信验证码这个知识点前,我们首先来了解下聚合数据 聚合数据介绍 聚合数据是一家国内最大的基础数据API提供商,专业从事互联网数据服务。免费提供从天气查询、空气质量、地图坐标到金融基金、电商比价、违章查询等各个领域的安全、稳定和高效的数据。开发者可以免费试用聚合数据API进行移动APP的快速开发,免除数据收集、维护等环节,大大降低开发周期及成本。因此我们可以采用聚合数据给我提供...

    jeyhan 评论0 收藏0
  • node本地服务器图片上传

    摘要:在自己做一个简单的后台管理系统时,用的是作本地数据库,然后用了的组件来实现图片的上传,中间有遇到那么点小坑,这里记录下,比较坑的一点就是,不知道文件的命名不能带空格,然后改了好久文件这里的话,就是简单点的使用图形界面框架的上传组件,然后 在自己做一个简单的后台管理系统时,用的是node作本地数据库,然后用了Element-ui的upload组件来实现图片的上传,中间有遇到那么点小坑,这...

    LoftySoul 评论0 收藏0
  • Android网络编程9Retrofit2前篇[基本使用]

    摘要:创建增加返回值为的支持这里的加上之前定义的参数形成完整的请求地址用于指定返回的参数数据类型,这里我们支持和类型。完整的代码如下增加返回值为的支持请求参数上文讲了访问网络的基本方法,接下来我们来了解下常用的请求参数。 前言 Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,而OkHttp现在已经得到Google官方...

    Nosee 评论0 收藏0
  • Android网络编程11源码解析Retrofit

    摘要:此前在例子中调用的,就是设置返回的数据支持转换为对象。最终会返回配置好的类。注释处遍历方法来对请求方式比如和请求地址进行解析。的方法主要做的就是用来请求网络并将返回的进行数据转换并回调给线程。至此,的源码就讲到这里。 前言最近文章的产出确实很少,因为我正在写一本Android进阶书籍,两头很难兼顾,但是每个月也得至少发一篇博客。上一篇我们介绍了Retrofit的使用方法,这一篇我们照例...

    songjz 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<