2012-06-12 40 views
83

Tôi đang tạo một API trả về kết quả dưới dạng JSON. Có thực hành tốt nhất hiện tại cho dù chúng ta nên bao gồm các khóa trong kết quả khi giá trị là null? Ví dụ:JSON có nên bao gồm các giá trị rỗng không

{ 
    "title":"Foo Bar", 
    "author":"Joe Blow", 
    "isbn":null 
} 

hoặc

{ 
    "title":"Foo Bar", 
    "author":"Joe Blow" 
} 

Kể từ thứ hai là nhỏ hơn tôi đang nghiêng về phía phong cách này, nhưng tôi không chắc chắn nếu có một phong cách ưa thích hay không. Từ quan điểm của khách hàng, có vẻ như cả hai kiểu đều có chức năng tương đương nhau. Bất kỳ ưu hoặc khuyết điểm nào đối với mỗi người?

+5

Không thể trả lời chính xác điều này. Câu trả lời đúng tùy thuộc vào yêu cầu của ứng dụng. OP đã chọn câu trả lời phù hợp với yêu cầu của mình. Nếu ứng dụng của bạn cần có khả năng phân biệt giữa việc biết nếu "isbn" là null nếu "isbn" có thể không được gửi từ máy chủ vì một lý do khác, bạn cần phải bao gồm nó. – Jacob

+0

@Jacob Mặc dù tôi không nói, ý định của tôi với câu hỏi này là JSON "đầy đủ" đại diện cho phản hồi đã được trả về. Khi một khách hàng có thể giả định rằng dường như không có sự khác biệt về chức năng giữa hai cách tiếp cận.Nếu API có chọn lọc không trả lại khóa/giá trị thì có, nó sẽ tạo ra sự khác biệt lớn về cách tiếp cận đã được thực hiện. – jjathman

+0

lợi ích của biểu diễn đầu tiên là lược đồ đối tượng được giữ nguyên, sự hiện diện của thuộc tính không rõ ràng dựa trên dữ liệu. ở định dạng thứ hai, thông tin này bị mất. JSON spec như vậy không bắt buộc hoặc định dạng AFAIK –

Trả lời

30

Thứ hai sẽ tiết kiệm một lượng nhỏ băng thông, nhưng nếu đó là một mối quan ngại bạn cũng sẽ sử dụng các mảng được lập chỉ mục thay vì điền JSON bằng các khóa. Rõ ràng, ["Foo Bar","Joe Blow"] ngắn hơn nhiều so với những gì bạn có bây giờ.

Xét về khả năng sử dụng, tôi không nghĩ rằng nó tạo ra bất kỳ sự khác biệt nào. Trong cả hai trường hợp, if(json.isbn) sẽ chuyển sang số else. Thường không cần phân biệt giữa null (không có giá trị) và undefined (không có giá trị đã cho).

+7

+1 cho * Thường không cần phân biệt giữa giá trị rỗng (không có giá trị) và không xác định (không có giá trị đã cho). * Thậm chí còn có một toán tử tiện dụng cho nó '! = Null' (không đúng mục đích) – Esailija

+0

Trường hợp duy nhất Tôi có thể nghĩ sẽ thử nghiệm nếu trình duyệt hỗ trợ một loại sự kiện nhất định. Ví dụ, 'if (typeof onbeforepaste ==" undefined ")' để xem liệu 'onBeforePaste' có được hỗ trợ hay không. Thậm chí sau đó nó không có sự khác biệt thực sự kể từ khi bạn có thể gán các sự kiện tất cả các bạn muốn (họ chỉ sẽ không làm bất cứ điều gì nếu không được hỗ trợ). –

+0

Trong trường hợp đó tôi sẽ kiểm tra 'onbeforepaste 'trong tài liệu', để kiểm tra sự tồn tại của thuộc tính. – Esailija

19

Trong JavaScript, null có nghĩa là một cái gì đó rất khác so với undefined.

Đầu ra JSON của bạn phải phản ánh những gì được ứng dụng của bạn sử dụng và cần thiết trong ngữ cảnh cụ thể khi sử dụng dữ liệu JSON.

+4

Không có "không xác định" trong JSON, vì vậy tôi nghĩ rằng anh ta chỉ hỏi có bao gồm các thuộc tính "rỗng" hay không - '{" prop ": undefined}' khác với '{ } '. – Bergi

+0

Đồng ý, tôi đang cố gắng giải thích rằng trên đầu nhận, nếu anh ta đang tìm kiếm một tài sản cụ thể để được đặt thành null, nó sẽ không được. Nó sẽ không được xác định, nếu bỏ đi. – Brad

10

Bạn chắc chắn nên bao gồm nó nếu có bất kỳ cần phân biệt giữa nullundefined vì chúng có hai ý nghĩa khác nhau trong Javascript. Bạn có thể nghĩ về null có nghĩa là bất động sản không xác định hoặc vô nghĩa, và undefined có nghĩa là tài sản không tồn tại.

Mặt khác, nếu không cần bất kỳ ai tạo nên sự khác biệt đó thì hãy tiếp tục và bỏ qua.

71

Tôi là người hâm mộ luôn bao gồm null một cách rõ ràng là mang ý nghĩa. Trong khi bỏ sót một tài sản thì không rõ ràng. Miễn là giao thức của bạn với máy chủ được thỏa thuận khi bất kỳ điều nào ở trên có thể hoạt động, nhưng nếu bạn chuyển null từ máy chủ, tôi tin rằng làm cho các API của bạn linh hoạt hơn sau này.

Cũng nên đề cập đến hàm hasOwnProperty của javascript cung cấp cho bạn thông tin chi tiết hơn.

/* if true object DOES contain the property with *some* value */ 
if(objectFromJSON.hasOwnProperty("propertyName")) 

/* if true object DOES contain the property and it has been set to null */ 
if(jsonObject.propertyName === null) 

/* if true object either DOES NOT contain the property 
    OR 
    object DOES contain the property and it has been set to undefined */ 
if(jsonObject.propertyName === undefined) 
+3

Chính xác, nhiều người cần hiểu sự khác biệt giữa "", null và không xác định. Câu trả lời cho câu hỏi này phụ thuộc vào yêu cầu của người dùng. – Jacob

+11

+1. Người ở đầu bên kia (người đã viết mã) sẽ được phục vụ tốt hơn bằng các giá trị rõ ràng. Họ có thể không viết JavaScript ;-) – Steve11235

+2

Lưu ý rằng việc kiểm tra đối với null không hoạt động với ==, === là bắt buộc (vì undefined == null)! – Tommy

0

Tôi nghĩ rằng không có sự khác biệt khi bạn sử dụng JSON làm dữ liệu đằng sau trải nghiệm của người dùng.

Sự khác biệt xuất hiện trong tệp cấu hình JSON, khi người dùng phải chỉnh sửa nội dung nào đó bằng tay. Khi bạn sử dụng ví dụ đầu tiên, bạn cung cấp cho người dùng một số gợi ý về cấu hình.

+1

Bạn có thể vui lòng giải thích thêm câu trả lời của bạn thêm một chút mô tả về giải pháp bạn cung cấp không? – abarisone

Các vấn đề liên quan