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à [\t] ở 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 (\t) , cụ thể là 2 space = 1 tab.
vd2

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

Vì trong project mình có một tool đã sinh ra file json mà đã sử dụng tab(\t) 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 \t. ( 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(\t)
-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 (\n) và sau đó là space thì remove nó hết rồi thay bằng tab(\t).
	+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!

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

1 Like

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 !

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

Chuỗi json dài vậy mà cứ replace là hại điện hại máy nhé :smile:
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.

1 Like

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

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 :joy:

1 Like

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;
   }
}
1 Like

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 :relieved: (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.

4 Likes

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

3 Likes

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.

2 Likes

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 ^^ !

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?