2015-11-12 21 views
5

Tôi đã đến một câu hỏi mà một người nào đó hỏi tôi, tại sao tôi quay đầu ra của json_decode thành một mảng assoc.json_decode vào mảng hoặc đối tượng

Đối với tôi, việc sử dụng mảng assoc dễ dàng hơn stdClasses và đã có nhiều hàm array_ * hỗ trợ xử lý dữ liệu sau khi tôi giải mã chuỗi json.

Sau một thử nghiệm hiệu suất ngắn, hóa ra, việc chuyển đổi thành mảng assoc nhanh hơn khoảng 20% ​​so với chuyển đổi thành stdClass.

Tuy nhiên, hành vi mặc định là $assoc = false. Vì vậy, tôi tự hỏi, là những lợi ích của việc sử dụng stdClasses khi xử lý dữ liệu json. Có bất kỳ loại json nào không thể được biểu diễn trong mảng assoc, nhưng trong stdClasses không?

+0

Khi JavaScript mã hóa một đối tượng, điều logic sẽ là để PHP giải mã một đối tượng. Nếu mảng được mã hóa, bạn mong đợi một mảng được giải mã. Tạo và khởi tạo một đối tượng có vẻ chậm hơn xử lý một mảng assoc. Cảm ơn bạn đã thông báo cho chúng tôi về điều này! –

+0

Bạn có thể cho chúng tôi thấy điểm chuẩn của bạn không? Tôi đã làm của riêng tôi với https://raw.githubusercontent.com/zemirco/sf-city-lots-json/master/citylots.json bằng cách sử dụng PHP 5.6.15 và kết quả đã được đóng yên tĩnh ... nhiều hơn như 4% chậm hơn. – svrnm

+0

@svrnm Chúng có một vòng lặp rất đơn giản và 'microtime' - nhưng mức tăng thực có thể khác nhau đối với mỗi chuỗi json. Có thể có các chuỗi có nhiều hay ít chi phí – Philipp

Trả lời

3

Điều này có thể bị đóng làm ý kiến, nhưng đối với tôi, tôi thường giải mã cho bất kỳ cấu trúc dữ liệu nào có ý nghĩa nhất đối với trường hợp sử dụng.

Ví dụ, nói JSON mô tả một mục duy nhất giống như một cuốn sách và nhìn một cái gì đó như thế này:

{ 
    "title": "Cool Book", 
    "author": "Amazing Author", 
    "publisher": "Evil Corporation", 
    ... 
} 

Đối với tôi đó là một đối tượng, ở chỗ nó là một mục duy nhất với những đặc tính khác nhau. Tôi sẽ có thể muốn đối xử với nó như một đối tượng trong mã tiếp theo của tôi, vì vậy tôi sẽ giải mã nó như một đối tượng.

Bây giờ, nếu JSON chứa loại dữ liệu có thể đại diện cho từ điển, bản đồ, bảng băm, v.v ..., trong đó tất cả các cặp khóa-giá trị, về bản chất, các mục tương tự, chỉ với các tra cứu khác nhau và các giá trị được ánh xạ, tôi có thể xem xét giải mã thành một mảng kết hợp. Có lẽ một ví dụ tốt về đó sẽ là một mã quốc gia vào bản đồ tên nước như thế này:

{ 
    "AF": "Afghanistan", 
    "AX": "Aland Islands", 
    "AL": "Albania", 
    "DZ": "Algeria", 
    ... 
} 

tôi có thể nghiêng để giải mã này để một mảng kết hợp, bởi vì tôi không cần bất kỳ đại diện đối tượng theo định hướng này thông tin, vì tôi chỉ sử dụng thông tin này để tra cứu khóa-giá trị.

Để trả lời câu hỏi của bạn về các cấu trúc dữ liệu khác có thể được biểu diễn bằng JSON, chính thức chỉ có hai cấu trúc dữ liệu được hỗ trợ trong JSON - đối tượng và mảng được lập chỉ mục bằng số. Điều này là do các gốc dựa trên javascript của định dạng tuần tự hóa, trong đó, ví dụ, khái niệm về một mảng kết hợp "out-of-the-box" không tồn tại. Tuy nhiên, bạn sẽ thấy rằng một số thư viện mã hóa/giải mã JSON trên các ngôn ngữ thêm hỗ trợ cho các cấu trúc dữ liệu hoặc loại khác, thường thêm hành vi xử lý xung quanh các kiểu dữ liệu nguyên thủy, nhưng tôi sẽ không dựa vào điều này trừ khi bạn hiểu đầy đủ cấu trúc dữ liệu sẽ được chuyển và cách chúng được mã hóa/giải mã trên tất cả các ứng dụng có thể truyền dữ liệu xung quanh.

Ví dụ, PHP cung cấp hỗ trợ cho một số nguyên thủy như trong ghi chú này từ tài liệu json_encode():

Lưu ý: Giống như bộ mã hóa tài liệu tham khảo JSON, json_encode() sẽ tạo ra JSON đó là một giá trị đơn giản (có nghĩa là, không phải là một đối tượng cũng như một mảng) nếu được cho một chuỗi, số nguyên, float hoặc boolean như một giá trị đầu vào. Trong khi hầu hết các bộ giải mã sẽ chấp nhận các giá trị này dưới dạng JSON hợp lệ, một số có thể không, như đặc tả không rõ ràng về điểm này. Để tóm tắt, hãy luôn kiểm tra rằng bộ giải mã JSON của bạn có thể xử lý đầu ra bạn tạo ra từ json_encode().

Cuối cùng, liên quan đến hiệu suất, nếu bạn quan tâm đến phát triển ứng dụng của mình, nơi quan tâm số một là tối ưu hóa hiệu suất cho thời gian thực hiện, sử dụng bộ nhớ, v.v ... và bạn có lý do để tin rằng lợi ích tương đối đáng kể có thể được thực hiện bằng cách tối ưu hóa logic deserialization JSON (và truy cập dữ liệu tiếp theo), sau đó bạn cuối cùng nên kiểm tra ứng dụng của bạn với dữ liệu đại diện và xem những gì làm việc tốt nhất cho bạn. Tôi đoán là điều này sẽ được thực hiện dọc theo các dòng tối ưu hóa vi mô cho hầu hết các ứng dụng.

0

Tôi cho rằng lý do là, JSON là "JavaScript Đối tượng Ký hiệu" và do đó mọi người mong đợi một đối tượng. Nếu bạn nhìn vào json.org đối tượng được định nghĩa là một tập hợp các cặp tên/giá trị không theo thứ tự và một mảng dành cho các tập hợp giá trị được sắp xếp, như mọi người được sử dụng nó trong javascript. Bạn cũng có thể tìm thấy số này trong số RFC 4627:

Cụm từ "đối tượng" và "mảng" xuất phát từ các quy ước về JavaScript.

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