Android - Trình phân tích cú pháp JSON
JSON là viết tắt của JavaScript Object Notation, là một định dạng trao đổi dữ liệu độc lập và là giải pháp thay thế tốt nhất cho XML. Chương này giải thích cách phân tích cú pháp tệp JSON và trích xuất thông tin cần thiết từ nó.
Android cung cấp bốn lớp khác nhau để thao tác dữ liệu JSON. Các lớp này làJSONArray,JSONObject,JSONStringer and JSONTokenizer.
Bước đầu tiên là xác định các trường trong dữ liệu JSON mà bạn quan tâm. Ví dụ: Trong JSON đưa ra bên dưới, chúng tôi chỉ quan tâm đến việc nhận nhiệt độ.
{
"sys":
{
"country":"GB",
"sunrise":1381107633,
"sunset":1381149604
},
"weather":[
{
"id":711,
"main":"Smoke",
"description":"smoke",
"icon":"50n"
}
],
"main":
{
"temp":304.15,
"pressure":1009,
}
}
JSON - Phần tử
Một tệp JSON bao gồm nhiều thành phần. Đây là bảng xác định các thành phần của tệp JSON và mô tả của chúng -
Sr.No | Thành phần & mô tả |
---|---|
1 | Array([) Trong tệp JSON, dấu ngoặc vuông ([) đại diện cho một mảng JSON |
2 | Objects({) Trong tệp JSON, dấu ngoặc nhọn ({) đại diện cho một đối tượng JSON |
3 | Key Một đối tượng JSON chứa một khóa chỉ là một chuỗi. Các cặp khóa / giá trị tạo nên một đối tượng JSON |
4 | Value Mỗi khóa có một giá trị có thể là chuỗi, số nguyên hoặc kép, v.v. |
JSON - Phân tích cú pháp
Để phân tích cú pháp một đối tượng JSON, chúng ta sẽ tạo một đối tượng của lớp JSONObject và chỉ định một chuỗi chứa dữ liệu JSON cho nó. Cú pháp của nó là -
String in;
JSONObject reader = new JSONObject(in);
Bước cuối cùng là phân tích cú pháp JSON. Một tệp JSON bao gồm các đối tượng khác nhau với các cặp khóa / giá trị khác nhau, v.v. Vì vậy, JSONObject có một chức năng riêng để phân tích cú pháp từng thành phần của tệp JSON. Cú pháp của nó được đưa ra dưới đây:
JSONObject sys = reader.getJSONObject("sys");
country = sys.getString("country");
JSONObject main = reader.getJSONObject("main");
temperature = main.getString("temp");
Phương pháp getJSONObjecttrả về đối tượng JSON. Phương phápgetString trả về giá trị chuỗi của khóa được chỉ định.
Ngoài các phương thức này, còn có các phương thức khác được cung cấp bởi lớp này để phân tích cú pháp tệp JSON tốt hơn. Các phương pháp này được liệt kê bên dưới -
Sr.No | Phương pháp & mô tả |
---|---|
1 | get(String name) Phương thức này chỉ trả về giá trị nhưng ở dạng Loại đối tượng |
2 | getBoolean(String name) Phương thức này trả về giá trị boolean được chỉ định bởi khóa |
3 | getDouble(String name) Phương thức này trả về giá trị kép được chỉ định bởi khóa |
4 | getInt(String name) Phương thức này trả về giá trị số nguyên được chỉ định bởi khóa |
5 | getLong(String name) Phương thức này trả về giá trị dài được chỉ định bởi khóa |
6 | length() Phương thức này trả về số lượng ánh xạ tên / giá trị trong đối tượng này .. |
7 | names() Phương thức này trả về một mảng chứa các tên chuỗi trong đối tượng này. |
Thí dụ
Để thử nghiệm với ví dụ này, bạn có thể chạy trên thiết bị thực tế hoặc trong trình giả lập.
Các bước | Sự miêu tả |
---|---|
1 | Bạn sẽ sử dụng Android studio để tạo một ứng dụng Android. |
2 | Sửa đổi tệp src / MainActivity.java để thêm mã cần thiết. |
3 | Sửa đổi res / layout / activity_main để thêm các thành phần XML tương ứng |
4 | Sửa đổi res / values / string.xml để thêm các thành phần chuỗi cần thiết |
5 | Chạy ứng dụng và chọn một thiết bị Android đang chạy và cài đặt ứng dụng trên đó và xác minh kết quả |
Sau đây là nội dung của tệp hoạt động chính được sửa đổi src/MainActivity.java.
package com.example.tutorialspoint7.myapplication;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
public class MainActivity extends AppCompatActivity {
private String TAG = MainActivity.class.getSimpleName();
private ListView lv;
ArrayList<HashMap<String, String>> contactList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contactList = new ArrayList<>();
lv = (ListView) findViewById(R.id.list);
new GetContacts().execute();
}
private class GetContacts extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
Toast.makeText(MainActivity.this,"Json Data is
downloading",Toast.LENGTH_LONG).show();
}
@Override
protected Void doInBackground(Void... arg0) {
HttpHandler sh = new HttpHandler();
// Making a request to url and getting response
String url = "http://api.androidhive.info/contacts/";
String jsonStr = sh.makeServiceCall(url);
Log.e(TAG, "Response from url: " + jsonStr);
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
// Getting JSON Array node
JSONArray contacts = jsonObj.getJSONArray("contacts");
// looping through All Contacts
for (int i = 0; i < contacts.length(); i++) {
JSONObject c = contacts.getJSONObject(i);
String id = c.getString("id");
String name = c.getString("name");
String email = c.getString("email");
String address = c.getString("address");
String gender = c.getString("gender");
// Phone node is JSON Object
JSONObject phone = c.getJSONObject("phone");
String mobile = phone.getString("mobile");
String home = phone.getString("home");
String office = phone.getString("office");
// tmp hash map for single contact
HashMap<String, String> contact = new HashMap<>();
// adding each child node to HashMap key => value
contact.put("id", id);
contact.put("name", name);
contact.put("email", email);
contact.put("mobile", mobile);
// adding contact to contact list
contactList.add(contact);
}
} catch (final JSONException e) {
Log.e(TAG, "Json parsing error: " + e.getMessage());
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),
"Json parsing error: " + e.getMessage(),
Toast.LENGTH_LONG).show();
}
});
}
} else {
Log.e(TAG, "Couldn't get json from server.");
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),
"Couldn't get json from server. Check LogCat for possible errors!",
Toast.LENGTH_LONG).show();
}
});
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
ListAdapter adapter = new SimpleAdapter(MainActivity.this, contactList,
R.layout.list_item, new String[]{ "email","mobile"},
new int[]{R.id.email, R.id.mobile});
lv.setAdapter(adapter);
}
}
}
Sau đây là nội dung sửa đổi của xml HttpHandler.java.
package com.example.tutorialspoint7.myapplication;
import android.util.Log;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
public class HttpHandler {
private static final String TAG = HttpHandler.class.getSimpleName();
public HttpHandler() {
}
public String makeServiceCall(String reqUrl) {
String response = null;
try {
URL url = new URL(reqUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
// read the response
InputStream in = new BufferedInputStream(conn.getInputStream());
response = convertStreamToString(in);
} catch (MalformedURLException e) {
Log.e(TAG, "MalformedURLException: " + e.getMessage());
} catch (ProtocolException e) {
Log.e(TAG, "ProtocolException: " + e.getMessage());
} catch (IOException e) {
Log.e(TAG, "IOException: " + e.getMessage());
} catch (Exception e) {
Log.e(TAG, "Exception: " + e.getMessage());
}
return response;
}
private String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line;
try {
while ((line = reader.readLine()) != null) {
sb.append(line).append('\n');
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}
Sau đây là nội dung sửa đổi của xml res/layout/activity_main.xml.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.tutorialspoint7.myapplication.MainActivity">
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
Sau đây là nội dung sửa đổi của xml res/layout/list_item.xml.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/activity_horizontal_margin">
<TextView
android:id="@+id/email"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingBottom="2dip"
android:textColor="@color/colorAccent" />
<TextView
android:id="@+id/mobile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#5d5d5d"
android:textStyle="bold" />
</LinearLayout>
Sau đây là nội dung của AndroidManifest.xml tập tin.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tutorialspoint7.myapplication">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Hãy thử chạy ứng dụng mà chúng tôi vừa sửa đổi. Tôi cho rằng bạn đã tạo raAVDtrong khi thiết lập môi trường. Để chạy ứng dụng từ Android studio, hãy mở một trong các tệp hoạt động của dự án của bạn và nhấp vào
Ví dụ trên hiển thị dữ liệu từ chuỗi json, Dữ liệu có chứa thông tin chi tiết về nhà tuyển dụng cũng như thông tin về mức lương.