JSON là một định dạng dùng để trao đổi dữ liệu phổ biến biến hiện nay. JSON là chữ viết tắt của Javascript Object Notation, cũng giống như XML nó có cấu trúc và quy tắc để lấy dữ liệu và 2 định dạng này có thể dễ dàng chuyển đổi cho nhau.
Ngày nay với sự phát triển của các ứng web đặc biệt là từ khi có sự gia đời của Ajax, định dạng dữ liệu Json ngày càng trở lên hữu ích trong việc truyền dữ liệu giữ Client và Service. Các nhà phát triển phần mềm có thể tạo ra các Web services phía server trả về dữ liệu định dạng Json có kích thước nhỏ hơn theo các yêu cầu Ajax từ phía Client thay vì trả về cả trang như phương pháp cũ ngày xưa. Các ngôn ngữ lập trình phía Server hướng đối tượng như Java, C#, VB.net đều đã phát triển những lớp mới hoặc được phân tách thành các thư viên để hỗ trơ việc chuyển đổi thành các chuỗi Json để trả về phía Client.
Ngôn ngữ lập trình C# cũng không phải là một ngoại lệ, nó có rất nhiều cách để bạn có thể thao tác với định dạng dữ liệu JSON. Bạn có thể tự code các lớp của riêng mình, sử dụng các lớp có sẵn của Microsoft được cung cấp ở trong namespace System.Text.Json hoặc sử dung Newtonsoft.Json. Trong bài viết này sẽ đề cập tới thư viện Newtonsoft.Json, một thư viện mã nguồn mở khá phổ biến trong cộng động .Net hiện nay
Trong nền tảng .Net, thư viện Newtonsoft.Json là một thư viện mã nguồn mở tốt nhất để thao tác với JSON hiện nay và được tích hợp sẵn trong các Project phát triển Web của Microsoft. Nếu các bạn phát triển cần trao đổi dữ liệu dạng Json thì Newtonsoft.Json (Json.NET) là một sự lựa chọn không hề tồi.
Chúng ta sẽ tìm hiểu cách sử dụng thông qua ví dụ sau:
Tạo một ứng dụng Net Core Console, với mục đích tổ chức lưu trữ các order trong một quán café vào file data.json. Sau đó cho phép người dùng nhập vào một bàn cụ thể, và tính toán thành tiền của từng mục sản phẩm và tổng tiền của hóa đơn. Cuối cùng xuất hóa đơn ra một file json khác.
Tại thư mục gốc của ổ đĩa C, tạo file data.json có cấu trúc như sau:
{ "orders": [ { "tableNo": "1", "paid": false, "starttime": "11:36 AM 19/05/2020", "orderdetails": [ { "name": "Black Coffee", "count": "2", "price": "10000" }, { "name": "lemon fruit", "count": "2", "price": "20000" } ] }, { "tableNo": "2", "paid": false, "starttime": "11:51 AM 19/05/2020", "orderdetails": [ { "name": "Milk coffee", "count": "2", "price": "15000" }, { "name": "Lemon fruit", "count": "3", "price": "20000" }, { "name": "Coca", "count": "3", "price": "9000" } ] } ] }
Theo cấu trúc của file data.json chúng ta tạo 3 class như sau để sử dụng khi convert
class OrderData { public List<Order> orders { get; set; } } class Order { public string tableNo { get; set; } public bool paid { get; set; } public string starttime { get; set; } public List<OrderDetail> orderdetails { get; set; } } class OrderDetail { public string name { get; set; } public string count { get; set; } public string price { get; set; } public string money { get; set; } public long CalculatorMoney() { return long.Parse(price) * int.Parse(count); } }
Xây dựng phương thức đọc dữ liệu từ file data.json và sử dụng JsonConvert.DeserializeObject để convert về model
OrderData orderData = new OrderData () { orders = new List<Order>() }; public void ReadData() { using (StreamReader sr = File.OpenText(@"C:\data.json")) { var obj = sr.ReadToEnd(); orderData = JsonConvert.DeserializeObject<OrderData>(obj); } }
Xây dựng các class tiếp theo để lưu trữ dữ liêu sau được xử lý
class Bill { public string tableNo { get; set; } public string starttime { get; set; } public string endtime { get; set; } public string total => SumTotal(); public List<OrderDetail> orderdetails { get; set; } public string SumTotal() { long sum = 0; foreach(var item in orderdetails) { sum += long.Parse(item.money); } return sum.ToString(); } }
Xây dựng các phương thức để xử lý dữ liệu, sau đó sử dụng JsonConvert.SerializeObject để conver từ model về json và ghi lại vào file bill_1_202005261150.json
public Order FindTable(string tableNo, out int position) { position = -1; if(orderData != null && orderData.orders != null) { foreach (var order in orderData.orders) { if (order.tableNo.Equals(tableNo) && !order.paid) { position = orderData.orders.IndexOf(order); return order; } } } return null; } public Bill ProcessBill(string tableNo) { var foundTable = FindTable(tableNo, out int pos); if(foundTable != null) { var bill = new Bill() { endtime = DateTime.Now.ToString("hh:mm tt dd/MM/yyyy"), starttime = foundTable.starttime, tableNo = foundTable.tableNo }; bill.orderdetails = new List<OrderDetail>(); foreach(var detail in foundTable.orderdetails) { bill.orderdetails.Add(new OrderDetail() { count = detail.count, money = detail.CalculatorMoney().ToString(), name = detail.name, price = detail.price, }); } return bill; } return null; } public bool PrintBill(string tableNo) { try { var bill = ProcessBill(tableNo); if (bill != null) { string fileName = $"bill_{tableNo}_{DateTime.Now.ToString("yyyyMMddhhmm")}.json"; using (StreamWriter sw = File.CreateText($"C:\{fileName}")) { var billData = JsonConvert.SerializeObject(bill); sw.WriteLine(billData); } return true; } return false; } catch(Exception e) { return false; } }
Sau khi xử lý chúng ta có được file json (bill_1_202005261150.json) kết quả như sau:
{ "tableNo": "1", "starttime": "11:36 AM 26/05/2020", "endtime": "11:50 AM 26/05/2020", "total": "60000", "orderdetails": [ { "name": "Black Coffee", "count": "2", "price": "10000", "money": "20000" }, { "name": "lemon fruit", "count": "2", "price": "20000", "money": "40000" } ] }
Qua bài viết này hy vọng các bạn có thể áp dụng để thao tác đọc và ghi dữ liệu vào file json.
Author: Nguyễn Hữu Anh Khoa
Đăng ký nhận bộ tài liệu học Java trên 2 trang giấy tại đây
Xem thêm: Java Coding Bootcamp là gì? Tổng quan về Java Coding Bootcamp
0 Lời bình