Android JSON data parsing_PHP tutorial
Android JSON data parsing
Software and hardware environment
- Macbook Pro MGX 72
- Android Studio 1.3.2
- Genymotion Simulator
Preface
There are very few apps today that do not deal with servers. Among them, in lightweight communication interactions, JSON (JavaScript Object Notation) and XML is also known as the Heavenly Sword and Dragon-Slaying Sword of client-server interaction solutions. This article mainly introduces JSON-related knowledge.
JSON object
The object in JSON is included in a pair of curly brackets. Each item in the object is a "key:value" data pair, and the data pairs are separated by commas . The key of a JSON object can only be of String type, and the value may be of other types such as number, boolean, or null. As shown below
<code class="none" style="-webkit-print-color-adjust:exact;margin:0px;padding:0px;border:none;border-radius:3px;background-color:transparent;">{ "Name" : "Alex", "Sex" : "Male", "Age" : "20",}</code>
JSON array
The JSON array is included in a pair of square brackets. Each element is a JSON object and is also separated by commas. The example is as follows
<code class="none" style="-webkit-print-color-adjust:exact;margin:0px;padding:0px;border:none;border-radius:3px;background-color:transparent;">[ { "Name" : "Alex", "Sex" : "Male", "Age" : "20", }, { "Name" : "May", "Sex" : "Female", "Age" : "19", }, { "Name" : "Mike", "Sex" : "Male", "Age" : "21", }]</code>
Basic usage of FastJSON
FastJSON is a framework developed by Alibaba that specializes in parsing JSON. According to their own tests, it is very fast and efficient, and there is no other framework. Let's take a JSON data query for Suzhou city weather forecast from an aggregated data website as an example. The obtained URL address is http://v.juhe.cn/weather/index?format=2&cityname=Suzhou&key=6f9276e4d79c5d102bbfb28717beba93. To ensure there is no problem with the data source, you can open the URL in a browser to see if there is data. Here is another tool for Mac, JSON Accelerator, which can not only crawl from the Internet, but also add http request header information, which is very convenient to use.
创建工程
新建工程取名为FastJSONDemo,由于要访问网络,所以需要在AndroidManifest.xml中添加相应权限
<code class="none" style="-webkit-print-color-adjust:exact;margin:0px;padding:0px;border:none;border-radius:3px;background-color:transparent;"><uses-permission android:name="android.permission.INTERNET"></uses-permission></code>
代码部分
网络请求部分,这里我们使用volley这个库,Google出品,使用简单。源码下载地址https://android.googlesource.com/platform/frameworks/volley/,jar包的下载地址http://download.csdn.net/detail/djstava/8793421。下载后把volley的库导入到工程中,UI的话,用了一个TextView来显示接收到的json数据
为了建立一个全局的请求队列,需要在实现一个继承自Application的子类,叫VolleyApplication
<code class="none" style="-webkit-print-color-adjust:exact;margin:0px;padding:0px;border:none;border-radius:3px;background-color:transparent;">package com.djstava.fastjsondemo;import android.app.Application;import com.android.volley.RequestQueue;import com.android.volley.toolbox.Volley;/*** 包名称: com.djstava.fastjsondemo* 创建人: djstava* 创建时间: 15/9/23 下午3:44*/public class VolleyApplication extends Application{ public static RequestQueue requestQueue; @Override public void onCreate() { super.onCreate(); requestQueue = Volley.newRequestQueue(getApplicationContext());}public static RequestQueue getVolleyQueue() { return requestQueue; }}</code>
然后在MainActivity中的onStart方法编写请求部分,然后在onStop方法中取消请求
<code class="none" style="-webkit-print-color-adjust:exact;margin:0px;padding:0px;border:none;border-radius:3px;background-color:transparent;">private static final String JSON_URL = "http://v.juhe.cn/weather/index?format=2&cityname=%E8%8B%8F%E5%B7%9E&key=6f9276e4d79c5d102bbfb28717beba93";//字段key是从聚合数据网站上申请过来的,请自行替换@Overrideprotected void onStart() { super.onStart(); JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, JSON_URL, null, new Response.Listener<jsonobject>() { @Override public void onResponse(JSONObject jsonObject) { try { textView.setText(jsonObject.toString()); Log.e(TAG,"result:" + jsonObject.getString("resultcode")); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Log.e(TAG, volleyError.getMessage()); } }); jsonObjectRequest.setTag("fastjson"); VolleyApplication.requestQueue.add(jsonObjectRequest);}@Overrideprotected void onStop() { super.onStop(); VolleyApplication.requestQueue.cancelAll("fastjson");}</jsonobject></code>
别忘了在AndroiManifest.xml文件Application标签中加入
<code class="none" style="-webkit-print-color-adjust:exact;margin:0px;padding:0px;border:none;border-radius:3px;background-color:transparent;">android:name=".VolleyApplication"</code>
使用Genymotion模拟器运行程序,可以看到获取的数据
为了方便读者查看,利用JSON Accelerator格式化一下
<code class="none" style="-webkit-print-color-adjust:exact;margin:0px;padding:0px;border:none;border-radius:3px;background-color:transparent;">{"result" : {"sk" : { "humidity" : "58%", "wind_direction" : "西北风", "temp" : "26", "wind_strength" : "2级", "time" : "17:27"},"today" : { "temperature" : "22℃~27℃", "dressing_index" : "舒适", "dressing_advice" : "建议着长袖T恤、衬衫加单裤等服装。年老体弱者宜着针织长袖衬衫、马甲和长裤。", "uv_index" : "弱", "comfort_index" : "", "wind" : "东北风3-4 级", "weather" : "多云转阵雨", "city" : "苏州", "date_y" : "2015年09月24日", "week" : "星期四", "wash_index" : "不宜", "weather_id" : { "fa" : "01", "fb" : "03" }, "travel_index" : "较适宜", "exercise_index" : "较适宜", "drying_index" : ""},"future" : [ { "temperature" : "22℃~27℃", "weather_id" : { "fa" : "01", "fb" : "03" }, "wind" : "东北风3-4 级", "week" : "星期四", "date" : "20150924", "weather" : "多云转阵雨" }, { "temperature" : "21℃~26℃", "weather_id" : { "fa" : "03", "fb" : "01" }, "wind" : "东北风3-4 级", "week" : "星期五", "date" : "20150925", "weather" : "阵雨转多云" }, { "temperature" : "21℃~27℃", "weather_id" : { "fa" : "01", "fb" : "01" }, "wind" : "东北风3-4 级", "week" : "星期六", "date" : "20150926", "weather" : "多云" }, { "temperature" : "21℃~28℃", "weather_id" : { "fa" : "00", "fb" : "00" }, "wind" : "东北风3-4 级", "week" : "星期日", "date" : "20150927", "weather" : "晴" }, { "temperature" : "22℃~28℃", "weather_id" : { "fa" : "01", "fb" : "01" }, "wind" : "东风3-4 级", "week" : "星期一", "date" : "20150928", "weather" : "多云" }, { "temperature" : "22℃~28℃", "weather_id" : { "fa" : "01", "fb" : "03" }, "wind" : "东风3-4 级", "week" : "星期二", "date" : "20150929", "weather" : "多云转阵雨" }, { "temperature" : "20℃~25℃", "weather_id" : { "fa" : "04", "fb" : "04" }, "wind" : "东南风4-5 级", "week" : "星期三", "date" : "20150930", "weather" : "雷阵雨" } ] }, "resultcode" : "200", "reason" : "successed!", "error_code" : 0}</code>
接下来该轮到fastjson登场了,,先到http://repo1.maven.org/maven2/com/alibaba/fastjson/下载对应版本的jar包,或者到https://github.com/alibaba/fastjson下载源码,再导入到工程中。
<code class="none" style="-webkit-print-color-adjust:exact;margin:0px;padding:0px;border:none;border-radius:3px;background-color:transparent;">JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, JSON_URL, null, new Response.Listener<jsonobject>() { @Override public void onResponse(JSONObject jsonObject) { try { textView.setText(jsonObject.toString()); com.alibaba.fastjson.JSONObject jsonObject1 = JSON.parseObject(jsonObject.toString()); for (Map.Entry<string object> entry : jsonObject1.entrySet()) { System.out.println(entry.getKey() + ":" + entry.getValue()); } } catch (Exception e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Log.e(TAG, volleyError.getMessage()); } });</string></jsonobject></code>
这样,简单的数据解析就完成了。
何为JavaBean?
JavaBean是符合某种规范的java组件,也就是java类,它必须满足如下特性:
- 有一个无参数的默认构造函数
- 有get和set方法
我们把公司员工抽象成一个类,然后利用fastjson来解析
<code class="none" style="-webkit-print-color-adjust:exact;margin:0px;padding:0px;border:none;border-radius:3px;background-color:transparent;">package com.djstava.fastjsondemo;/** * 包名称: com.djstava.fastjsondemo * 创建人: djstava * 创建时间: 15/9/28 上午11:07 */public class Employee { private int num; private String name; private int age; public Employee(int num, String name, int age) { this.num = num; this.name = name; this.age = age; } public void setNum(int num) { this.num = num; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public int getNum() { return num; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Employee{" + "num=" + num + ", name='" + name + '\'' + ", age=" + age + '}'; }}</code>
在Android Studio中,可以自动生成get、set、toString这些方法,Code->Generate,快捷键是Command + N。
<code class="none" style="-webkit-print-color-adjust:exact;margin:0px;padding:0px;border:none;border-radius:3px;background-color:transparent;">Employee employee = new Employee(1,"djstava",20);Log.e(TAG,JSON.toJSONString(employee));</code>
可以看出输出的json格式与我们类中定义的属性的顺序不一致,其实没有关系,json都是通过key去获取其对应的value的。
如果仅仅是想解析JavaBean类中某几个字段时,可以使用SimplePropertyPreFilter这个类来实现,将需要解析的字段添加进来,如将Employee类中的"num"和"name"解析出来
<code class="none" style="-webkit-print-color-adjust:exact;margin:0px;padding:0px;border:none;border-radius:3px;background-color:transparent;">SimplePropertyPreFilter simplePropertyPreFilter = new SimplePropertyPreFilter(Employee.class,"num","name");Log.e(TAG,JSON.toJSONString(employee,simplePropertyPreFilter));</code>
源码下载
http://download.csdn.net/detail/djstavav/9144789
参考文献
1、http://www.json.org/
2、https://github.com/alibaba/fastjson/wiki
3、https://www.juhe.cn/docs/api/id/39

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



In recent days, Ice Universe has been steadily revealing details about the Galaxy S25 Ultra, which is widely believed to be Samsung's next flagship smartphone. Among other things, the leaker claimed that Samsung only plans to bring one camera upgrade

OnLeaks has now partnered with Android Headlines to provide a first look at the Galaxy S25 Ultra, a few days after a failed attempt to generate upwards of $4,000 from his X (formerly Twitter) followers. For context, the render images embedded below h

Alongside announcing two new smartphones, TCL has also announced a new Android tablet called the NXTPAPER 14, and its massive screen size is one of its selling points. The NXTPAPER 14 features version 3.0 of TCL's signature brand of matte LCD panels

In recent days, Ice Universe has been steadily revealing details about the Galaxy S25 Ultra, which is widely believed to be Samsung's next flagship smartphone. Among other things, the leaker claimed that Samsung only plans to bring one camera upgrade

The Vivo Y300 Pro just got fully revealed, and it's one of the slimmest mid-range Android phones with a large battery. To be exact, the smartphone is only 7.69 mm thick but features a 6,500 mAh battery. This is the same capacity as the recently launc

Samsung has not offered any hints yet about when it will update its Fan Edition (FE) smartphone series. As it stands, the Galaxy S23 FE remains the company's most recent edition, having been presented at the start of October 2023. However, plenty of

The Redmi Note 14 Pro Plus is now official as a direct successor to last year'sRedmi Note 13 Pro Plus(curr. $375 on Amazon). As expected, the Redmi Note 14 Pro Plus heads up the Redmi Note 14 series alongside theRedmi Note 14and Redmi Note 14 Pro. Li

OnePlus'sister brand iQOO has a 2023-4 product cycle that might be nearlyover; nevertheless, the brand has declared that it is not done with itsZ9series just yet. Its final, and possibly highest-end,Turbo+variant has just beenannouncedas predicted. T
