Xu Hướng 5/2024 # Hướng Dẫn Xử Lý Json Trong Android # Top 4 Yêu Thích

JSON (JavaScript Object Notation) là một định dạng trao đổi dữ liệu dữ liệu (data exchange format). Nó lưu trữ các dữ liệu theo cặp khóa và giá trị. So với XML thì JSON đơn giản về dễ đọc hơn.

Hãy xem một ví dụ đơn giản của JSON:

{

"name" : "Tran",

"address" : "Hai Duong, Vietnam",

"phones" : [0121111111, 012222222]

}

Các cặp key-value có thể lồng nhau:

{

"id": 111 ,

"name":"Microsoft",

"websites": [

"http://microsoft.com",

"http://msn.com",

"http://hotmail.com"

],

"address":{

"street":"1 Microsoft Way",

"city":"Redmond"

}

}

Trong Java có rất nhiều các thư viện mã nguồn mở giúp bạn thao tác với tài liệu JSON, chẳng hạn như:

Android hỗ trợ sẵn thư viện để làm việc với JSON, bạn không cần phải khai báo bất cứ một thư viện nào khác. Trong tài liệu hướng dẫn này tôi sẽ hướng dẫn bạn làm việc với JSON sử dụng JSON API có sẵn trong hệ điều hành của Android.

Tôi tạo nhanh một project có tên JSONTutorial để làm việc với JSON thông qua các ví dụ.

Name: JSONTutorial

Package name: org.o7planning.jsontutorial

Tôi tạo thêm một vài file json trong thư mục ‘raw’, các file này sẽ tham gia vào một các ví dụ trong tài liệu này.

Các nguồn cung cấp dữ liệu JSON có thể từ file hoặc URL,… Ở cuối tài liệu bạn có thể xem ví dụ lấy dữ liệu JSON từ URL, phân tích và hiển thị trên một ứng dụng Android.

{

"id": 111 ,

"name":"Microsoft",

"websites": [

"http://microsoft.com",

"http://msn.com",

"http://hotmail.com"

],

"address":{

"street":"1 Microsoft Way",

"city":"Redmond"

}

}

Thiết kế activity_main.xml:

<androidx.constraintlayout.widget.ConstraintLayout

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

<EditText

android:id="@+id/editText"

android:layout_width="0dp"

android:layout_height="220dp"

android:layout_marginStart="16dp"

android:layout_marginLeft="16dp"

android:layout_marginTop="16dp"

android:layout_marginEnd="16dp"

android:layout_marginRight="16dp"

android:ems="10"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent"

<Button

android:id="@+id/button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="39dp"

android:text="Running the Example"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent"

Một số class tham gia vào các ví dụ:

package org.o7planning.jsontutorial.beans;

public class Address {

private String street;

private String city;

public Address() {

}

public Address(String street, String city) {

this.street = street;

chúng tôi = city;

}

public String getStreet() {

return street;

}

public void setStreet(String street) {

this.street = street;

}

public String getCity() {

return city;

}

public void setCity(String city) {

chúng tôi = city;

}

@Override

public String toString() {

return street + ", " + city;

}

}

package org.o7planning.jsontutorial.beans;

public class Company {

private int id;

private String name;

private String[] websites;

private Address address;

public int getId() {

return id;

}

public void setId(int id) {

chúng tôi = id;

}

public String getName() {

return name;

}

public void setName(String name) {

chúng tôi = name;

}

public String[] getWebsites() {

return websites;

}

public void setWebsites(String[] websites) {

this.websites = websites;

}

public Address getAddress() {

return address;

}

public void setAddress(Address address) {

this.address = address;

}

@Override

public String toString() {

StringBuilder sb = new StringBuilder();

sb.append("n id:" + this.id);

sb.append("n name:" + this.name);

if (this.websites != null) {

sb.append("n website: ");

for (String website : this.websites) {

sb.append(website + ", ");

}

}

if (this.address != null) {

sb.append("n address:" + this.address.toString());

}

return sb.toString();

}

}

Trong ví dụ này chúng ta sẽ đọc file dữ liệu JSON và chuyển nó thành đối tượng Java.

package org.o7planning.jsontutorial.json;

import android.content.Context;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;

import org.o7planning.jsontutorial.R;

import org.o7planning.jsontutorial.beans.Address;

import org.o7planning.jsontutorial.beans.Company;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

public class ReadJSONExample {

public static Company readCompanyJSONFile(Context context) throws IOException,JSONException {

String jsonText = readText(context, R.raw.company);

JSONObject jsonRoot = new JSONObject(jsonText);

int id= jsonRoot.getInt("id");

String name = jsonRoot.getString("name");

JSONArray jsonArray = jsonRoot.getJSONArray("websites");

String[] websites = new String[jsonArray.length()];

for(int i=0;i < jsonArray.length();i++) {

websites[i] = jsonArray.getString(i);

}

JSONObject jsonAddress = jsonRoot.getJSONObject("address");

String street = jsonAddress.getString("street");

String city = jsonAddress.getString("city");

Address address= new Address(street, city);

Company company = new Company();

company.setId(id);

company.setName(name);

company.setAddress(address);

company.setWebsites(websites);

return company;

}

private static String readText(Context context, int resId) throws IOException {

InputStream is = context.getResources().openRawResource(resId);

BufferedReader br= new BufferedReader(new InputStreamReader(is));

StringBuilder sb= new StringBuilder();

String s= null;

while(( s = br.readLine())!=null) {

sb.append(s);

sb.append("n");

}

return sb.toString();

}

}

package org.o7planning.jsontutorial;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import org.o7planning.jsontutorial.beans.Company;

import org.o7planning.jsontutorial.json.ReadJSONExample;

public class MainActivity extends AppCompatActivity {

private EditText outputText;

private Button button;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

this.outputText = (EditText)this.findViewById(R.id.editText);

this.button = (Button) this.findViewById(R.id.button);

@Override

runExample(view);

}

});

}

public void runExample(View view) {

try {

Company company = ReadJSONExample.readCompanyJSONFile(this);

outputText.setText(company.toString());

} catch(Exception e) {

outputText.setText(e.getMessage());

e.printStackTrace();

}

}

}

Ví dụ sau chuyển một đối tượng Java thành một dữ liệu JSON.

package org.o7planning.jsontutorial.json;

import android.util.JsonWriter;

import org.o7planning.jsontutorial.beans.Address;

import org.o7planning.jsontutorial.beans.Company;

import java.io.IOException;

import java.io.Writer;

public class JsonWriterExample {

public static void writeJsonStream(Writer output, Company company ) throws IOException {

JsonWriter jsonWriter = new JsonWriter(output);

jsonWriter.beginObject();// begin root

jsonWriter.name("id").value(company.getId());

jsonWriter.name("name").value(company.getName());

String[] websites= company.getWebsites();

jsonWriter.name("websites").beginArray();

for(String website: websites) {

jsonWriter.value(website);

}

jsonWriter.endArray();// end websites

jsonWriter.name("address").beginObject();

jsonWriter.name("street").value(company.getAddress().getStreet());

jsonWriter.name("city").value(company.getAddress().getCity());

jsonWriter.endObject();// end address

jsonWriter.endObject();

}

public static Company createCompany() {

Company company = new Company();

company.setId(123);

company.setName("Apple");

String[] websites = { "http://apple.com", "https://jobs.apple.com" };

company.setWebsites(websites);

Address address = new Address();

address.setCity("Cupertino");

address.setStreet("1 Infinite Loop");

company.setAddress(address);

return company;

}

}

package org.o7planning.jsontutorial;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import org.o7planning.jsontutorial.beans.Company;

import org.o7planning.jsontutorial.json.JsonWriterExample;

import java.io.StringWriter;

public class MainActivity extends AppCompatActivity {

private EditText outputText;

private Button button;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

this.outputText = (EditText)this.findViewById(R.id.editText);

this.button = (Button) this.findViewById(R.id.button);

@Override

runExample(view);

}

});

}

public void runExample(View view) {

try {

StringWriter output = new StringWriter();

Company company = JsonWriterExample.createCompany();

JsonWriterExample.writeJsonStream(output, company);

String jsonText = output.toString();

outputText.setText(jsonText);

} catch(Exception e) {

outputText.setText(e.getMessage());

e.printStackTrace();

}

}

}

Để đọc JSON từ một URL bạn cần phải sử dụng các kỹ thuật của Android Networking, download tập tin JSON sau đó phân tích (parse) nó.