2012-01-18 31 views
25

Tôi có chuỗi JSON thụt vào, ví dụ:Giảm bớt chuỗi JSON thụt lề trong .NET

{ 
    "a": 1 
} 

Tuy nhiên, tôi không có loại dụ để được tuần tự hóa hoặc không tham gia.

Trong trường hợp của tôi, cách hiệu quả nhất để giảm bớt một chuỗi JSON là gì? ví dụ.

{"a":1} 

Tôi không ngại sử dụng thư viện nếu sẵn sàng sản xuất.

Trả lời

55
Regex.Replace(myJSON, "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1") 

nên làm điều đó. Nó đảm bảo rằng các chuỗi chứa ký tự khoảng trống được giữ nguyên và tất cả các ký tự khoảng trắng khác sẽ bị loại bỏ. Tất cả các từ khóa JSON (false, true, null) phải được phân tách bằng dấu phẩy hoặc dấu câu khác để chỉ cần giữ khoảng trắng trong các chuỗi.


Tùy chọn đầu tiên (\"(?:[^\"\\\\]|\\\\.)*\") khớp với chuỗi kép được trích dẫn. Các (...) có nghĩa là đầu ra được chụp và có sẵn trong sự thay thế là $1. [^\"\\\\] khớp với bất kỳ ký tự nào ngoại trừ dấu ngoặc kép hoặc ký tự thoát \.

Vì trùng khớp xảy ra từ trái sang phải, tùy chọn thứ hai, \s+ sẽ không khớp với khoảng trống bên trong một chuỗi.

Vì vậy, chúng tôi đối sánh toàn bộ chuỗi và dấu cách bên ngoài chuỗi. Trong trường hợp trước đây, $1 là mã thông báo chuỗi và trong trường hợp thứ hai $1 là chuỗi trống vì nhóm 1 không được sử dụng.


này hoạt động như dự định vì

  1. các thẻ chỉ trong JSON có thể chứa khoảng trắng là chuỗi dụng dấu ngoặc kép. Không có chuỗi hoặc nhận xét được trích dẫn đơn lẻ trong JSON.
  2. ngữ pháp JSON yêu cầu dấu chấm câu đơn giữa tất cả mã thông báo nhiều ký tự, do đó việc xóa không gian sẽ không hợp nhất mã thông báo. Trong JavaScript, điều này có thể có vấn đề vì không gian được yêu cầu để phá vỡ mã thông báo; var x=0 khác với varx=0x - -(y) khác với x--(y).