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

0
117

Các bạn đã nắm được 3 kiểu tương tác File: Text FileSerialize FileXML 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:

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

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

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 đó:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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<SanPham>,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<SanPham>
{
var data:MutableList<SanPham> = mutableListOf()
try
{
val gson = Gson()
var file=FileReader(path)
data = gson.fromJson<MutableList<SanPham>>(file,
object : TypeToken<MutableList<SanPham>>()
{
}.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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
fun main(args: Array<String>) {
var data:MutableList<SanPham> = 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é:

1
2
3
4
5
fun main(args: Array<String>) {
var data:MutableList<SanPham> = 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!

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

Gửi phản hồi

Website này sử dụng Akismet để hạn chế spam. Tìm hiểu bình luận của bạn được duyệt như thế nào.