2010-01-21 31 views
6

Tôi được giao nhiệm vụ xác định giao tiếp giữa hai ứng dụng web. Tôi đã quyết định sử dụng JSON cho việc này. Làm thế nào phổ biến là nó có một nút gốc trong JSON?Các nút gốc trong JSON

Giả sử chúng tôi có đối tượng ô tô. Đây là JSON với "xe" là nút gốc:

{"Car": { 
    "Make":"Mustang", 
    "YearBuilt":"1999"}} 

Vì vậy, bây giờ hãy nói rằng tôi có một đối tượng lốp và vì chúng ta đang tiêu chuẩn hóa trên có nút gốc, chương trình này cũng phải có nó.

{"Tire": {"Make": "Brirdgestone", "Size":"15"}} 

Lồng ghép đối tượng lốp JSON vào đối tượng Ô tô ban đầu cho thấy mức độ khó sử dụng của nó.

{"Car": { "Make":"Mustang", 
"YearBuilt":"1999", 
"Tires": "[{"Tire": {"Make": "Brirdgestone", "Size":"15"}}, 
{"Tire": {"Make": "Brirdgestone", "Size":"15"}}, 
{"Tire": {"Make": "Bridgestone", "Size":"15"}}, 
{"Tire": {"Make": "Brirdgestone", "Size":"15"}} 
]}} 

Vì vậy, được tuần tự hóa trong PHP, việc chế tạo Lốp xe đầu tiên sẽ là $object->Car->Tires[0]->Tire->Make. Có thêm cấp độ lốp ở đó vì nút gốc.

Nếu lốp không có nút gốc thì mã có thể mỏng hơn rất nhiều.

{"Car": { "Make":"Mustang", 
"YearBuilt":"1999", 
"Tires": "[{ {"Make": "Bridgestone", "Size":"15"}}, 
{"Make": "Brirdgestone", "Size":"15"}}, 
{"Make": "Brirdgestone", "Size":"15"}}, 
{"Make": "Brirdgestone", "Size":"15"}}]}} 

Trong PHP, có ít sự nhầm lẫn vì có ít dư thừa: Các làm từ lốp xe đầu tiên được gọi bởi $object->Car->Tires[0]->Make

Có điều gì xấu bởi không có một nút gốc? Tôi thích có nút gốc vì nó hoạt động giống như một tên lớp, nhưng mức độ không cần thiết sẽ làm tôi rất nhiều và sẽ làm cho việc duyệt web trở nên phức tạp hơn.

Trả lời

4

Tôi sẽ bỏ qua cả hai nút gốc, LốpXe.

Hãy nhớ rằng việc sử dụng chính của JSON là chuyển các đối tượng qua mạng ở định dạng nhỏ gọn. Không có cách nào khác ngoài việc này. Bạn muốn làm việc với dữ liệu mà JSON mã hóa và bằng cách thêm các nút gốc, bạn đang tạo các đối tượng thùng chứa rỗng không có nhận dạng và mục đích thực sự. Khi omiting các nút gốc, bạn sẽ có được

$car->tires[0]->make 

và JS bạn muốn nhận được

car.tires[0].make 

Đây là rõ ràng hơn nhiều và đại diện cho đối tượng tốt hơn nhiều. Hãy nhớ rằng, đây là những gì bạn sẽ phải làm việc với. Chắc chắn, bạn có thể sử dụng một số loại trình ánh xạ JSON để ánh xạ các đối tượng sẽ được tuần tự hóa như thế nào và kết quả là các đối tượng trên, nhưng đó là rất nhiều nỗ lực và không đáng giá.

Nếu bạn muốn có tên lớp trong JSON, chỉ cần biến nó thành thuộc tính, ví dụ:

{ 'klass': 'Car', 'make': 'Mustang', 'year':1999 } 
+0

Tôi đồng ý. Các nút gốc sẽ chỉ làm cho mã ứng dụng tiêu thụ không cần thiết tiết lộ chi tiết. – Steve

+0

Tuyệt vời, cảm ơn rất nhiều. Tôi nghĩ về một khu vực nơi nó sẽ là quan trọng. Nếu các gương JSON và tài liệu XML, bạn nên thêm ít nhất một đối tượng chính vì trong XML, bạn cần một phần tử gốc. Một đồng nghiệp cũng chỉ ra rằng điều quan trọng đối với các cuộc gọi lại JSONP và sẽ là cấu trúc tốt hơn nếu tôi tạo một API. Ví dụ, Yahoo và ebay API bọc mọi thứ xung quanh một nút ResultSet. Điều này cho phép các trình phân tích cú pháp quan tâm đến các kiểu để liên kết ResultSet với một kiểu đối tượng. –

+0

Vâng, tôi chắc chắn bạn có thể nghĩ về UseCases nơi nó có thể có ích, nhưng sau đó một lần nữa, bất cứ khi nào tôi sử dụng JSON trong các ứng dụng của tôi, tôi đã gọi lại cách biết cách xử lý dữ liệu mà họ nhận được, ví dụ: example.com/cars/find/id/123 sẽ trả về dữ liệu ô tô và cuộc gọi lại của tôi sẽ tạo chúng. – Gordon

0

@Gordon tạo điểm tốt. Tuy nhiên, tôi thích sử dụng AOP với các tin nhắn AJAX để chặn các tin nhắn đến và đi từ máy chủ. Các interceptor này thêm vào mỗi thông điệp một dấu thời gian và các tin nhắn được gửi từ máy chủ một cờ trạng thái (thất bại, ngoại lệ, thành công, bất cứ điều gì ...). Như bạn có thể phỏng đoán, tôi đặt sử dụng nút JSON gốc cho tải trọng, trạng thái và dấu thời gian.

Cờ trạng thái được gửi từ máy chủ có thể được kiểm tra trong một chức năng (khía cạnh) ở giao diện người dùng và tất cả các ngoại lệ được xử lý ở một nơi. Khi máy chủ không thành công vì lý do ngoại trừ một ngoại lệ, khía cạnh/lời khuyên cho phép dữ liệu được truyền tới bộ khởi tạo AJAX.

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