Trang chủ » Blog » Đọc và ghi file JSON sử dụng JsonConvert trong C#

Đọc và ghi file JSON sử dụng JsonConvert trong C#

bởi CodeGym | 24/07/2024 15:10 | Blog

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.

file JSON

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

Gửi Lời bình

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

BÀI VIẾT LIÊN QUAN

BẠN MUỐN HỌC LẬP TRÌNH?

GỌI NGAY

098 953 44 58

Đăng ký tư vấn lộ trình học lập trình

Đăng ký tư vấn, định hướng lộ trình học và giải đáp các thắc mắc về ngành nghề – Miễn phí – Online.

14 + 10 =

TƯ VẤN VỀ LỘ TRÌNH HỌC NGHỀ LẬP TRÌNH TẠI CODEGYM
TƯ VẤN VỀ LỘ TRÌNH HỌC NGHỀ LẬP TRÌNH TẠI CODEGYM