2010-11-17 23 views
12

Tôi thấy rất nhiều tham chiếu đến "JSON nén" khi nói đến các định dạng tuần tự khác nhau. Chính xác thì nó là gì? Nó chỉ là gzipped JSON hay cái gì khác?"JSON nén" là gì?

Trả lời

20

nén JSON loại bỏ phím: cặp giá trị của mã hóa json để chìa khóa cửa hàng và giá trị trong mảng song song riêng biệt:

// uncompressed 
JSON = { 
    data : [ 
    { field1 : 'data1', field2 : 'data2', field3 : 'data3' }, 
    { field1 : 'data4', field2 : 'data5', field3 : 'data6' }, 
    ..... 
    ] 
}; 

//compressed 
JSON = { 
    data : [ 'data1','data2','data3','data4','data5','data6' ], 
    keys : [ 'field1', 'field2', 'field3' ] 
}; 

Phương pháp này sử dụng tôi tìm thấy ở đây

Nội dung từ liên kết (http://www.nwhite.net/?p=242)

hiếm khi tìm thấy chính mình ở nơi tôi đang viết các ứng dụng javascript sử dụng AJAX ở dạng thuần túy. Tôi từ lâu đã từ bỏ chữ ‘X’ và thay thế nó bằng chữ ‘J’ (JSON). Khi làm việc với Javascript, nó chỉ có ý nghĩa để trả về JSON. Dấu chân nhỏ hơn, phân tích cú pháp dễ dàng hơn và cấu trúc dễ dàng hơn là tất cả những lợi thế tôi đã đạt được kể từ khi sử dụng JSON.

Trong một dự án gần đây, tôi thấy mình không hài lòng với kích thước lớn của bộ kết quả của mình. Dữ liệu tôi đã quay trở lại là dữ liệu dạng bảng, dưới dạng các đối tượng cho mỗi hàng. Tôi đã trả về một tập hợp kết quả là 50, với 19 lĩnh vực mỗi. Những gì tôi nhận ra là nếu tôi tăng thêm kết quả, tôi có thể có được một dạng nén.

// nén

JSON = { 
    data : [ 
    { field1 : 'data1', field2 : 'data2', field3 : 'data3' }, 
    { field1 : 'data4', field2 : 'data5', field3 : 'data6' }, 
    ..... 
    ] 
}; 

// nén

JSON = { 
    data : [ 'data1','data2','data3','data4','data5','data6' ], 
    keys : [ 'field1', 'field2', 'field3' ] 
}; 

tôi sáp nhập tất cả các giá trị của tôi vào một mảng duy nhất và lưu trữ tất cả các lĩnh vực của tôi trong một mảng riêng biệt. Trả về một cặp giá trị khóa cho mỗi kết quả khiến tôi tốn 8800 byte (8.6kb). Ripping các lĩnh vực ra và đặt chúng trong một mảng riêng biệt chi phí cho tôi 186 byte. Tổng số tiền tiết kiệm 8.4kb.

Bây giờ tôi có tệp JSON được nén nhiều hơn, nhưng cấu trúc lại khác và giờ khó làm việc hơn. Vì vậy, tôi thực hiện một giải pháp trong Mootools để làm cho giải nén trong suốt.

Request.JSON.extend({ 

    options : { 
     inflate : [] 
    } 

}); 




Request.JSON.implement({ 

    success : function(text){ 
     this.response.json = JSON.decode(text, this.options.secure); 
     if(this.options.inflate.length){ 
      this.options.inflate.each(function(rule){ 
       var ret = ($defined(rule.store)) ? this.response.json[rule.store] : this.response.json[rule.data]; 
       ret = this.expandData(this.response.json[rule.data], this.response.json[rule.keys]); 
      },this); 
     } 
     this.onSuccess(this.response.json, text); 
    }, 

    expandData : function(data,keys){ 
     var arr = []; 
     var len = data.length; var klen = keys.length; 
     var start = 0; var stop = klen; 
     while(stop < len){ 
      arr.push(data.slice(start,stop).associate(keys)); 
      start = stop; stop += klen; 
     } 
     return arr; 
    } 

}); 

Request.JSON now has an inflate option. You can inflate multiple segments of your JSON object if you so desire. 

Usage: 

new Request.JSON({ 
     url : 'url', 
     inflate : [{ 'keys' : 'fields', 'data' : 'data' }] 
     onComplete : function(json){} 
}); 

Vượt qua nhiều đối tượng thổi phồng tùy thích với mảng tăng tùy chọn. Nó có thuộc tính tùy chọn được gọi là 'lưu trữ' Nếu đặt tập dữ liệu tăng cao sẽ được lưu trữ trong khóa đó thay thế.

Chuỗi mong đợi ‘khóa’ và ‘trường’ khớp với vị trí trong thư mục gốc của đối tượng JSON của bạn.

+0

này được phiếu bầu tán thành của tôi nếu bạn có thể thêm một trích dẫn ... không bao giờ nghe nói về nó trước và nó có vẻ khá mát mẻ. – Domenic

+1

Một điều cần lưu ý trong bài viết, một người bình luận "Isaac Schlueter" chứng minh rằng so sánh rằng phương pháp này kém hiệu quả hơn chỉ sử dụng gzip, mặc dù tác giả lưu ý rằng không phải tất cả các trình duyệt đều chấp nhận gzip. – Seanny123

+0

Cả hai liên kết đều đã chết. Có thư viện nào hỗ trợ điều này không? – Nisarg

0

Câu trả lời có khả năng nhất là nó thực sự chỉ được nén JSON. Không có ý nghĩa tiêu chuẩn nào khác cho cụm từ này.

Sắp xếp lại một mảng đồng nhất của các đối tượng JSON thành một cặp mảng là một kỹ thuật rất hữu ích để làm cho tải trọng nhỏ hơn và tăng tốc mã hóa và giải mã, nó thường không được gọi là "JSON nén". Tôi đã không chạy trên nó bao giờ hết trong mã nguồn mở hoặc bất kỳ API mở, nhưng chúng tôi sử dụng kỹ thuật này trong nội bộ và gọi nó là "jsontable".

1

Có trụ sở tại câu trả lời Paniyar, chúng tôi có thể chuyển đổi một danh sách các đối tượng trong "nén" Json định dạng sử dụng C# như thế này:

var JsonString = serializer.Serialize(
new 
{ 
    cols = new[] { "field1", "field2", "field3"}, 
    items = data.Select(x => new object[] {x.field1, x.field2, x.field3}) 
}); 

tôi đã sử dụng một loạt các đối tượng vì các lĩnh vực có thể int, bool, chuỗi ...

More Giảm: Nếu trường có được lặp lại rất thường xuyên và nó là một loại chuỗi, bạn có thể nén một chút được nhiều hơn nếu bạn thêm một danh sách riêng biệt của lĩnh vực đó ... ví dụ, một tên trường vị trí công việc, thành phố, vv là ứng cử viên xuất sắc cho việc này. Bạn có thể thêm danh sách riêng biệt của các mục này và trong mỗi mục thay đổi giá trị cho số tham chiếu. Điều đó sẽ làm cho Json của bạn thêm lite.

0

nén:

[["KeyA", "KeyB", "KeyC", "KeyD", "KeyE", "KeyF"], 
["ValA1", "ValB1", "ValC1", "ValD1", "ValE1", "ValF1"], 
["ValA2", "ValB2", "ValC2", "ValD2", "ValE2", "ValF2"], 
["ValA3", "ValB3", "ValC3", "ValD3", "ValE3", "ValF3"], 
["ValA4", "ValB4", "ValC4", "ValD4", "ValE4", "ValF4"]] 

nén:

[{KeyA: "ValA1", KeyB: "ValB1", KeyC: "ValC1", KeyD: "ValD1", KeyE: "ValE1", KeyF: "ValF1"}, 
{KeyA: "ValA2", KeyB: "ValB2", KeyC: "ValC2", KeyD: "ValD2", KeyE: "ValE2", KeyF: "ValF2"}, 
{KeyA: "ValA3", KeyB: "ValB3", KeyC: "ValC3", KeyD: "ValD3", KeyE: "ValE3", KeyF: "ValF3"}, 
{KeyA: "ValA4", KeyB: "ValB4", KeyC: "ValC4", KeyD: "ValD4", KeyE: "ValE4", KeyF: "ValF4"}] 
Các vấn đề liên quan