Bài 32-Xử lý JSon trong Kotlin – Bài 1


Các bạn đã nắm được 3 kiểu tương tác File: Text File, Serialize File, XML file. Bây giờ Tui hướng dẫn loại định dạng file cuối cùng rất nổi tiếng hiện nay đó là định dạng Json.

Khái niệm về JSon Tui đã trình bày ở bài 51 của Android, các bạn có thể vào bài này để đọc thêm.

Kotlin cũng có sẵn các lớp để tương tác Json, hoặc có nhiều thư viện ngoài rất nổi tiếng như GSon, Klaxon… giúp chúng ta dễ dàng chuyển Object Model thành Json và từ Json thành Object Model vô cùng lợi hại.

Trong bài này Tui sẽ hướng dẫn các bạn cách dùng GSon trong Kotlin để chuyển đổi qua loại giữa Object Model và Json.

Tính tới thời điểm Tui viết bài học này thì GSon có phiên bản mới nhất là 2.8.1 (update ngày 31/05/2017)

Bạn cần tải thư viện này về rồi reference nó vào Project trong IntelliJ IDEA của bạn.

Để tải GSon 2.8.1 bạn vào link: https://repo1.maven.org/maven2/com/google/code/gson/gson/2.8.1/

Tải tập tin gson-2.8.1.jar (dụng lượng khoảng 228kb) từ  link ở trên về máy tính.

Tui nói sơ qua cách thức hoạt động của GSon:

Để chuyển đổi Kotlin Model tới JSon ta làm như sau:

    val gson = Gson()
    val obj = KotlinModel()//lớp nào đó trong Kotlin

// 1. Kotlin object to JSON, and save into a file
    val file=FileWriter("D:\\file.json")
    gson.toJson(obj, file)
    file.close()
// 2. Kotlin object to JSON, and assign to a String
    val jsonInString = gson.toJson(obj)

Để chuyển đổi JSon về Kotlin Model ta làm như sau:

val gson = Gson()

// 1. JSON to Kotlin model, read it from a file.
    val data = gson.fromJson(FileReader("D:\\file.json"), SanPham::class.java)

// 2. JSON to Kotlin Model, read it from a Json String.
    val jsonInString = "{'name' : 'cocacola'}"
    val data= gson.fromJson(jsonInString, SanPham::class.java)

// JSON to JsonElement, convert to String later.
    val json = gson.fromJson(FileReader("D:\\file.json"), JsonElement::class.java)
    val result = gson.toJson(json)

Nếu dữ liệu Json là dạng JsonArray  thì để đưa về Kotlin  Model ta phải làm như sau:

val gson = Gson()
val json = "[{\"name\":\"cocacola\"}, {\"name\":\"pepsi\"}]"
val data:MutableList = gson.fromJson(json, 
        object : TypeToken() 
        {}.type)

Bây giờ Tui sẽ hướng dẫn chi tiết từng bước cụ thể để các bạn có thể dễ dàng hiểu và vận dụng thư viện GSon.

Tạo một Project tên là HocJSonFile, từ Project này ta tạo 1 thư mục(directory) tên là libs để chép thư viện gson-2.8.1.jar vào libs:

Bấm chuột phải vào Project/ chọn New/ chọn Directory:

Đặt tên directory là libs rồi bấm Ok, lúc này thư mục libs sẽ được tạo ra trong Project. Ta chép gson-2.8.1.jar vào thư mục này như hình dưới đây:

Tiếp theo ta cần đưa gson-2.8.1.jar thành thư viện sử dụng trong Project, cách làm như sau:

Bấm chuột phải vào gson-2.8.1.jar rồi chọn add as Library như hình ở trên, màn hình cấu hình sẽ xuất hiện:

Đặt tên(để mặc định) rồi bấm OK, lúc này bạn quan sát có sự thay đổi trong cách hiển thị, thấy được tập các lớp nằm trong thư viện này:

Bây giờ ta tiến hành tạo lớp Sản phẩm giống như các kỹ thuật xử lý text file, serialize file, xml file mà bạn đã được học trước đó:


import java.io.Serializable
/**
* Created by cafe on 02/06/2017.
*/
class SanPham:Serializable {
var ma:Int=0
var ten:String=""
var donGia:Double=0.0
constructor()
constructor(ma: Int, ten: String, donGia: Double) {
this.ma = ma
this.ten = ten
this.donGia = donGia
}
override fun toString(): String {
return "$ma\t$ten\t$donGia"
}
}

Tiếp tục tạo lớp JSonFileFactory để Lưu và đọc Json bằng GSon:


import com.google.gson.Gson
import java.io.FileWriter
import java.io.FileReader
import com.google.gson.reflect.TypeToken

/**
* Created by cafe on 02/06/2017.
*/
class JSonFileFactory {
/**
* @author Trần Duy Thanh
* @param data: Dữ liệu là Danh sách sản phẩm muốn lưu
* @param path: Đường dẫn lưu trữ
* @return true nếu lưu thành công, false nếu lưu thất bại
*/
fun LuuFile(data:MutableList,path:String):Boolean
{
try {
val gs= Gson()
val file=FileWriter(path)
gs.toJson(data,file)
file.close()
return true
}
catch (ex:Exception)
{
ex.printStackTrace()
}
return false
}
/**
* @author Trần Duy Thanh
* @param path:đường dẫn muốn đọc dữ liệu
* @return Danh sách sản phẩm MutableList
*/
fun DocFile(path:String):MutableList
{
var data:MutableList = mutableListOf()
try
{
val gson = Gson()
var file=FileReader(path)
data = gson.fromJson<MutableList>(file,
object : TypeToken<MutableList>()
{
}.type
)
file.close()
}
catch (ex:Exception)
{
ex.printStackTrace()
}
return data
}
}

Bạn thấy đấy, Gson giúp chúng ta đơn giản hóa mọi việc lưu và đọc dữ liệu. Đây là một trong những thư viện nổi tiếng, được sử dụng rất nhiều trong các dự án, và định dạng dữ liệu JSon ngày càng phổ biến, có thể hơn cả XML vốn đã nổi đình nổi đám trước đó.

Cuối cùng ta tạo hàm main để kiểm tra:


fun main(args: Array) {

var data:MutableList = mutableListOf()
var sp1=SanPham(1,"Coca cola",15.5)
data.add(sp1)
var sp2=SanPham(2,"Sting",25.0)
data.add(sp2)
var sp3=SanPham(3,"Redbull",17.0)
data.add(sp3)
var kqLuu= JSonFileFactory().LuuFile(data,"d:/dulieusanpham.json")
if(kqLuu)
{
println("Lưu Json file thành công")
}
else
{
println("Lưu Json file thất bại")
}
}

Khi chạy hàm main ở trên thì ta có kết quả sau:

Lưu Json file thành công

Bây giờ ta vào ổ D xem tập tin dulieusanpham.json có được lưu thành công hay chưa:

Rõ ràng kết quả đã lưu thành công, bây giờ ta sẽ gọi hàm đọc thông tin lên nhé:


fun main(args: Array) {
var data:MutableList = JSonFileFactory().DocFile("d:/dulieusanpham.json")
for (sp in data)
println(sp)
}

Khi chạy hàm main ở trên thì ta có kết quả sau:

1 Coca cola 15.5
2 Sting 25.0
3 Redbull 17.0

Như vậy ta đã lưu và đọc JSon File thành công, các bạn tự áp dụng vào các dự án cụ thể nhé, cấu trúc JSon File trong trường hợp này nó sẽ tự động build dựa vào cấu trúc Class và mối quan hệ giữa các Class mà bạn tạo ra.

Bài sau Tui sẽ trình bày thêm cách lấy dữ liệu Json từ Internet trong Kotlin, các Json có cáu trúc phức tạp, các bạn chú ý theo dõi nhé

Các bạn có thể tải source code bài này ở đây: http://www.mediafire.com/file/7jgvvzyschy77gg/HocJSonFile.rar

Hẹn gặp các bạn ở những bài tiếp theo

Chúc các bạn thành công!

Trần Duy Thanh (http://communityuni.com/)

11 responses

  1. […] bài 32 Tui đã trình bày chi tiết cách sử dụng thư viện GSon để Lưu Kotlin Model thành […]

  2. […] đã trình bày kỹ cách sử dụng JSon trong Kotlin ở các bài 32, bài 33 . Tui muốn minh họa thêm một ví dụ cuối cùng về đọc JSon trong Kotlin, […]

  3. […] đã trình bày kỹ cách sử dụng JSon trong Kotlin ở các bài 32, bài 33 . Tui muốn minh họa thêm một ví dụ cuối cùng về đọc JSon trong Kotlin, […]

  4. […] thư viên jgoodies-forms.jar (khoảng 86kb) rồi tham chiếu nào vào Project giống như bài 32 mà Tui đã hướng dẫn, sau đó thiết kế giao diện theo cấu trúc dưới đây (Ngay […]

  5. […] Bài 32-Xử lý JSon trong Kotlin – Bài 1 […]

  6. […] đã trình bày kỹ cách sử dụng JSon trong Kotlin ở các bài 32, bài 33 . Tui muốn minh họa thêm một ví dụ cuối cùng về đọc JSon trong Kotlin, […]

  7. […] thư viên jgoodies-forms.jar (khoảng 86kb) rồi tham chiếu nào vào Project giống như bài 32 mà Tui đã hướng dẫn, sau đó thiết kế giao diện theo cấu trúc dưới đây […]

  8. […] Trong bài 32 Tui đã trình bày chi tiết cách sử dụng thư viện GSon để Lưu Kotlin Model thành JSon và Đọc JSon thành Kotlin Model như thế nào. Ở bài này Tui tiếp tục làm thêm một ví dụ phức tạp hơn về JSon trong Kotlin, đó là tạo ra 2 lớp có mối quan hệ Master-Detail, đây là một trong những trường hợp thường gặp nhiều nhất trong quá trình triển khai dự án thật. Cụ thể Tui sẽ bổ sung thêm một Lớp Danh Mục, nó có mối quan hệ với Lớp Sản Phẩm: Một Danh Mục có nhiều Sản phẩm và Một Sản phẩm thuộc về một danh Mục nào đó. Để qua đây chúng ta tìm hiểu xem GSon tạo ra file JSon như thế nào cũng như phục hồi lại Kotlin Model ra sao. […]

  9. […] thư viên jgoodies-forms.jar (khoảng 86kb) rồi tham chiếu nào vào Project giống như bài 32 mà Tui đã hướng dẫn, sau đó thiết kế giao diện theo cấu trúc dưới đây (Ngay […]

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.