2011-10-25 21 views
10

Chỉ là một ý nghĩ thực sự ... và tự hỏi nếu Gzipped JSON đã bao gồm điều này.Làm cho phản hồi JSON thậm chí nhỏ hơn ... chỉ là một ý tưởng

Nhưng nói rằng bạn có một danh sách các đối tượng trò chơi trong một phản ứng:

game = { 
    name: 'Randomer Quest!', 
    description: 'Randomer's Quest is a brilliant game!', 
    activated: true, 
    points: 10, 
    thumb: 'randomer-quest.jpg' 
}; 

Khi bạn json_encode này, nó trở nên 151 bytes:

{"games": [{"name":"Randomer Quest!","description":"Randomer's Quest is a brilliant game!","activated":true,"points":10,"thumb":"randomer-quest.jpg"}]} 

Ok ... nhưng những gì nếu bạn có một danh sách khoảng 100 game? Đó là khoảng 13,913 bytes ... nhưng chúng tôi có thực sự cần phải tiếp tục tuyên bố những thuộc tính đó không? Tôi biết bạn có thể giải mã nó và lặp lại nó (ma thuật) nhưng nếu chúng ta thông minh hơn về nó và khai báo các thuộc tính trong một đối tượng riêng biệt và sau đó có một mảng dữ liệu? Chúng tôi sẽ phải điền vào các đặc tính không có thường xuyên nhưng tôi vẫn nghĩ nó có giá trị.

Something như thế này:

{ 
"games": { 
    p: ["name", "description", "activated", "points", "thumb"], 
    d: [ 
     ["Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg"], 
     ["Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg"] 
    ] 
} 

}

P là tài sản, D là các dữ liệu trong mảng. Sau đó chúng tôi có: 9,377 bytes 67% kích thước!

Ok Tôi biết bạn sẽ nói điều đó không có gì ngoài việc bạn thấy các yêu cầu giống như 40-100kb. Và tôi nghĩ đó là một sự khác biệt khá lớn. Bất cứ ai sử dụng một cái gì đó như thế này chưa? Có lẽ chúng ta có các công cụ đã tự động thực hiện điều này?

32 bitkid đã nói khá nhiều rằng nếu bạn định làm điều này, bạn cũng có thể chỉ cần cắt nó xuống định dạng CSV ... có ý nghĩa ... đó sẽ là khoảng 9,253 bytes 66,5%.

"name", "description", "activated", "points", "thumb" 
"Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg" 
"Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg" 

Tôi đã nhìn thấy yêu cầu JSON khoảng 100kb, mà sẽ biến thành 66.5kb (mất 33.5kb)

Bạn nghĩ gì?

Dom

+1

[JSONH] (https://github.com/WebReflection/JSONH) cũng tương tự. – hyperslug

+0

đó sẽ là một "TSON", một định dạng Bảng JSON (Tôi đã đề xuất một tên) – SparK

+0

Tôi thực sự thích ý tưởng này!Có vấn đề chính xác này ngay bây giờ - phản ứng JSON quá lớn do sự lặp lại lớn của tên thuộc tính. – HorseloverFat

Trả lời

11

Tôi đồng ý điều này gọn hơn nhiều.

{ 
    "games": { 
     p: ["name", "description", "activated", "points", "thumb"], 
     d: [ 
      ["Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg"], 
      ["Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg"] 
     ] 
    } 
} 

Nhưng chờ đợi, bạn có thể tối ưu hóa hơn nữa, bạn có thực sự cần đối tượng "trò chơi" không? điều này thậm chí còn nhỏ hơn!

{ 
    p: ["name", "description", "activated", "points", "thumb"], 
    d: [ 
     ["Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg"], 
     ["Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg"] 
    ] 
} 

Và thực sự, whats điểm của "p" và "d" và các đối tượng có chứa, tôi biết rằng các tên thuộc tính sẽ là người đầu tiên, và dữ liệu của tôi sẽ là thứ hai?

[ 
    ["name", "description", "activated", "points", "thumb"], 
    ["Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg"], 
    ["Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg"] 
] 

Và các điểm đánh dấu đối tượng và mảng này vừa mới nhận được, tiết kiệm thêm vài byte!

"name", "description", "activated", "points", "thumb" 
"Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg" 
"Randomer Quest!", "Randomer's Quest is a brilliant game!", true, 10, "randomer-quest.jpg" 

Đợi ... định dạng này đã tồn tại. Đó là CSV. Và nó đã được khoảng từ giữa những năm 1960. Và một phần lý do tại sao XML và JSON được phát minh ngay từ đầu. JSON và XML thêm tính linh hoạt cho các đối tượng đang được lưu trữ và làm cho chúng dễ đọc hơn các đối tượng nhị phân được đóng gói chặt chẽ. Bạn có thực sự lo lắng về kích thước của dữ liệu đi qua đường ống? Nếu bạn là (nếu đó là, trên thực tế, nút cổ chai của bạn) sau đó có một loạt các cách khác nhau để giải quyết vấn đề đó.

Nhưng, cá nhân, tôi nghĩ bạn nên sử dụng công nghệ và công cụ cho những gì chúng được tạo ra và những gì chúng nổi trội khi làm.

Bạn đang cố gắng sử dụng một cái búa để vặn vít ... Bạn sẽ nhận được nó trên tường, nhưng nó sẽ không được đẹp hay dễ chịu cho một trong hai bên liên quan.

Tìm mẫu giải quyết vấn đề của bạn, không phải theo cách khác.

+0

Điểm tốt: D Bây giờ bạn đề cập đến nó ... có lẽ nó sẽ là một ý tưởng tốt để bắt đầu sử dụng CSV nhiều hơn một chút. Tôi thích JSON nhưng tôi chỉ nghĩ quá nhiều là lãng phí khi chuyển các thuộc tính cho mọi thứ cho một chút khả năng đọc (không thường xuyên bạn cần đọc JSON thô). Đoán tôi sẽ bắt đầu sử dụng CSV nhiều hơn nữa. Tôi có nghĩa là phản ứng JSON phải được phân tích cú pháp anyway để chạy một CSV thông qua phân tích cú pháp để đạt được kết quả tương tự. Sẽ cập nhật câu hỏi của tôi với kích thước của CSV: P –

+0

@Dominic: bạn có muốn giải quyết vấn đề này hàng ngày (hoặc ba tháng kể từ bây giờ) không? Một trong đó mô tả các lĩnh vực được cho, hoặc hoàn toàn không đánh dấu một (người cuối cùng)? Thực tế là bạn phải nhớ trường nào của tệp CSV là không đáng giá một vài byte. Nhưng * caveat emptor *. Sau một vài tháng sử dụng CSV, bạn sẽ thấy những gì tôi có ý nghĩa. Ngoài ra, JSON cho phép bạn * lồng ghép * đối tượng bên trong những người khác, những gì CSV không. –

+0

Chắc chắn nếu bạn cần làm tổ đối tượng bên trong những người khác thì tôi không thể thấy bất kỳ cách nào khác xung quanh nó nhưng tôi vẫn không thấy vấn đề là không có nhãn bên cạnh mỗi mục. Bạn không đọc JSON thô vì có những công cụ làm cho nó dễ đọc cũng giống như ở đây. –

0

Điều này khá thú vị, bạn có thể muốn kiểm tra BSON nếu bạn có rất nhiều dữ liệu để chuyển.

2

Tôi sử dụng ColdFusion cho ngôn ngữ phía máy chủ, có chức năng serializeJson(). Điều này tạo ra một gói JSON, và nếu nó từ một truy vấn, nó trông gần như chính xác như những gì bạn đang đề xuất.

{ 
    "COLUMNS": [ 
     "ID", 
     "NAME" 
    ], 
    "DATA": [ 
     [ 
      1, 
      "London" 
     ], 
     [ 
      2, 
      "Liverpool" 
     ], 
     [ 
      3, 
      "Glasgow" 
     ] 
    ] 
} 

Hoạt động khá tốt.

5

Từ kinh nghiệm, lý do chính đằng sau việc sử dụng định dạng dựa trên văn bản là chúng dễ dàng cho con người (với các công cụ không phức tạp) để đọc và gỡ lỗi. [Ví dụ: tôi coi XML là một sự không thể thực hiện được đối với hầu hết các tác vụ].

Tham chiếu khá cũ về lý do chúng tôi sử dụng định dạng văn bản, mặc dù vẫn đáng đọc nghiêm trọng là this chapter of The Art of Unix Programming.

Vì vậy, bạn phải nhắm đến sự rõ ràng, không phải kích thước. Nhắm đến kích thước là trường hợp tối ưu hóa sớm.

Nếu bạn lo lắng về băng thông hoặc bộ nhớ, hãy xem xét nén dữ liệu. Định dạng văn bản cho vay tốt để nén nhanh và mạnh mẽ, đến điểm kỹ thuật, chúng không thua kém các định dạng nhị phân nhị phân sizewise. Ngoài ra, bạn tách các mối quan tâm của 1/đại diện cho dữ liệu thuận tiện 2/chuyển dữ liệu hiệu quả.

Tôi không am hiểu về miền này, nhưng tôi sẵn sàng đặt cược có 1/thư viện Javascript để nén 2/cách có hệ thống để nén dữ liệu ở cấp giao thức.

Cuối cùng, nếu bạn lo lắng về hiệu suất, tốt hơn, bạn muốn có lý do thuyết phục (và dữ liệu lược tả vững chắc) để từ bỏ sự thoải mái mà định dạng dựa trên văn bản cung cấp.

+0

Ahah vâng nhưng đầu ra JSON thô không thể đọc được mà không có các công cụ tốt đẹp để hiển thị hoặc trải qua nó: D Giống như trình định dạng JSON cho Chrome: https://chrome.google.com/webstore/detail/chklaanhfefbnpoihckbnefhakgolnmc –

+0

@Dominic Watson: Tất cả là về việc trao đổi khả năng đọc và tính khả dụng. JSON có sẵn trong nhiều môi trường và ít khó đọc hơn bằng mắt thường so với XML. Ngoài ra, các công cụ để thao tác XML có xu hướng nặng hơn nhiều so với JSON (và tôi chưa thấy trường hợp sử dụng mà bạn cần * XML trên một giải pháp thay thế nhẹ hơn). –

0

Còn MessagePack thì sao?

http://msgpack.org/

MessagePack là một định dạng nhị phân serialization hiệu quả. Nó cho phép bạn trao đổi dữ liệu giữa nhiều ngôn ngữ như JSON. Nhưng nó nhanh hơn và nhỏ hơn. Các số nguyên nhỏ được mã hóa thành một byte và các chuỗi ngắn điển hình chỉ yêu cầu thêm một byte ngoài các chuỗi .

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