01/10/2018, 11:01

Thay đổi ký tự thụt đầu dòng của file json

Xin chào các bạn, chủ đề mình cần thảo luận là về cấu trúc của file .json nha!

Đây là hai cấu trúc file tương ứng từ trên xuống là sử dụng [space] và [ ] ở thụt đầu dong.

{
  "$ten":"Nam",
  "$mssv":"123456",
  "$diemcacmon": [
    { 
      "$tenmonhoc":"toan",
      "diemthi":7,
      "$tong":7.25
    }
  ]
}



{
	"$ten":"Nam",
	"$mssv":"123456",
	"$diemcacmon": [
		{ 
			"$tenmonhoc":"toan",
			"diemthi":7,
			"$tong":7.25
		}
	]
}

Mình đã dùng C# viết chương trình ghi ra một file json vd tên sinhvien.json
thì cấu trúc mặc định của file là những “thụt đầu dòng” đều sử dụng khoảng trắng [space].
vd1

....
[space][space]"$ten":"Nam",
....  

Nhưng mình muốn đổi những “thụt đầu dòng” này thành tab ( ) , cụ thể là 2 space = 1 tab.
vd2

....
[	]"$ten":"Nam",
....  

Vì trong project mình có một tool đã sinh ra file json mà đã sử dụng tab( ) như vd2.

->và nó là bất di bất dịch, mình bị BUỘC phải sinh ra file có cấu trúc . ( Các bạn xem như mặc định luôn nha (T_T)).

và mình cũng đã tổng kết đc như sau:
-2 space = 1 tab(	)
-Cách giải quyết mình là :
    +Đọc chuỗi string sau khi parse file json.
	+Nếu gặp xuống dòng (
) và sau đó là space thì remove nó hết rồi thay bằng tab(	).
	+với quy định như sau : đếm số space đã remove,nếu 2 space mình thay bằng 1tab,4 space thay bằng 2 tab.v.v.

-Ngoài cách giải quyết trên, không biết các bạn nào có cách giải quyết khác hay hơn không ? Xin cảm ơn các bạn nhiều!

HK boy viết 13:10 ngày 01/10/2018

2 space = 1 tab thì dùng sublime text để chuyển thôi :v

dragon viết 13:10 ngày 01/10/2018

Mình cần viết tool hỗ trợ bạn ơi , tool mình viết bằng C# ! Để cho máy tự làm á chứ mình ko nhúng tay vào làm thủ công !

HK boy viết 13:03 ngày 01/10/2018

Mình nghĩ là ngoài cách replace(' ', '\t') thì không có cách nào hay hơn :v

明玉 viết 13:03 ngày 01/10/2018

Chuỗi json dài vậy mà cứ replace là hại điện hại máy nhé
Sao không dùng StringBuilder, rồi đọc từng phần tử trong chuỗi json, đọc đến đâu, append cho StringBuilder đến đó, giảm độ phức tạp không gian.

dragon viết 13:03 ngày 01/10/2018

StringBuilder

Bạn demo thử được không ^^ nói có vẽ trừu tượng quá mình ko rõ lắm !

Dark.Hades viết 13:15 ngày 01/10/2018

Ngứa tay thì đọc thẳng code của tool rồi thay ký tự indent xem.
Replace trong trường hợp này vô dụng vì trong string chắc chắn có space

Ngoài ra thử tìm thư viện hỗ trợ cái khoản thay indent xem sao

明玉 viết 13:11 ngày 01/10/2018

Bạn demo thử được không ^^ nói có vẽ trừu tượng quá mình ko rõ lắm !

Thử cái này xem:

string json = @"{
  ""$ten"":""Nam"",
  ""$mssv"":""123456"",
  ""$diemcacmon"": [
    { 
      ""$tenmonhoc"":""toan"",
      ""diemthi"":7,
      ""$tong"":7.25
    }
  ]
}";
// https://stackoverflow.com/questions/1100260/multiline-string-literal-in-c-sharp
StringBuilder newJson = new StringBuilder();
bool space_flag = false;
for (int i = 0; i < json.Length; i++)
{
   // cho rằng trong json, kí tự xuống dòng chỉ là \n chứ không có chuyện \r hay \r\n
   if (json[i] != '\n' && space_flag == false) newJson.Append(json[i]);
   else if (space_flag == false) 
   {
      newJson.Append('\n');
      space_flag = true;
   }
   else if (json[i] == ' ' && (i + 1 < json.Length) && json[i + 1] == ' ')
   {
      newJson.Append('\t');
      i += 1;
   }
   else
   {
      newJson.Append(json[i]);
      if (json[i] != '\n') space_flag = false;
   }
}
Khoa NTA viết 13:06 ngày 01/10/2018

Theo mình thì cách đơn giản nhất (không quan tâm đến tốc độ thực thi) thì parse JSON rồi xuất chuỗi và ghi lại là được (thư viện hỗ trợ parse JSON bằng C# trên mạng cũng nhiều).

Trên Google có hướng dẫn cắt chuỗi/đọc file theo từng dòng1 nên không cần phải dùng for và so sánh với '\n' đâu :v

Mà mình thắc mắc là cái thụt đầu dòng đó đâu quan trọng với JSON mà phải định dạng chi cho cực vậy bạn?

P/s: mình không rành C#, có sai thì thông cảm. Ahihi.

Phan Bá Hải viết 13:01 ngày 01/10/2018

Mà mình thắc mắc là cái thụt đầu dòng đó đâu quan trọng với JSON mà phải định dạng chi cho cực vậy bạn?

Mình cũng nghĩ thế. Miễn sao parse được qua Object là ngon rồi

Tao Không Ngu. viết 13:03 ngày 01/10/2018

Hi dragon.

  1. Bạn tìm hiểu qua về Json.
  2. Trong cú pháp Json có quy định dùng cách hay tab ?
  3. Dùng thư viện. Với những cái đã có chuẩn như Json hay XML tốt nhất là dùng thư viện VD
    http://www.newtonsoft.com/json
    Nó là đơn giản và hiệu quả.

P/S Mình không chắc là trong đặc tả file json có yêu cầu buộc viết băng tab hay cách nhưng nếu tool của bạn chỉ đọc được file dùng tab thì hình như có gì đó không đúng.

dragon viết 13:02 ngày 01/10/2018

Thanks bạn nhé , mặc dù cách này cũng chạy từ đầu chuổi tới cuối chuỗi ^^ !

Bài liên quan
0