2012-09-17 29 views
15

Khi sử dụng:Knockout serialization với ko.toJSON - làm thế nào để bỏ qua tính năng mà là null

var dataToSave = ko.toJSON(myViewModel); 

.. là nó có thể không giá trị serialize đó là null?

Serializing ViewModel hiện tại của tôi tạo ra khoảng 500KB của JSON nhất trong số đó là kết thúc như:

"SomeObject": { 
    "Property1": 12345, 
    "Property2": "Sometext", 
    "Property3": null, 
    "Property4": null, 
    "Property5": null, 
    "Property6": null, 
    "Property7": null, 
    "Property8": null, 
    "Property9": false 
} 

Nếu tôi có thể nhận được các serializer để bỏ qua các giá trị null thì điều này có thể được giảm xuống:

"SomeObject": { 
    "Property1": 12345, 
    "Property2": "Sometext", 
    "Property9": false 
} 

Bất kỳ ý tưởng nào về cách tôi có thể hướng dẫn trình nối tiếp bỏ qua các giá trị rỗng?

+3

Một điều cần lưu ý, ko.toJSON ** thực hiện ** bỏ qua các giá trị không xác định, xem fiddle ví dụ. http://jsfiddle.net/Rynan/EnVmu/ – Rynan

+0

@Rynan - Đó là một quan sát hữu ích. Tôi không nhận ra điều đó. –

Trả lời

26

Hãy nhớ rằng ko.toJSON chỉ là một sửa đổi của JSON stringify. Bạn có thể vượt qua trong một số replacer function.

Ví dụ về cách sử dụng hàm thay thế trong Knockout, tôi đặt cùng một số JSFiddle dựa trên một trong số knockout tutorials. Lưu ý sự khác biệt giữa các hàm makeJsonmakeCleanJson. Chúng ta có thể chọn không trả về bất kỳ giá trị nào trong hàm replacer của chúng ta và mục đó sẽ bị bỏ qua trong chuỗi JSON.

self.makeJson = function() { 
    self.JsonInfo(ko.toJSON(self.availableMeals)); 
}; 

self.makeCleanJson = function() { 
    self.JsonInfo(ko.toJSON(self.availableMeals, function(key, value) { 
     if (value == null) 
     { 
      return; 
     } 
     else 
     { 
      return value; 
     } 
    })); 
}; 
+1

Câu trả lời tuyệt vời, deltree. Và cảm ơn jsFiddle. Thay đổi duy nhất tôi thực hiện là sử dụng 'value === null' thay vì 'value == null' chỉ để chắc chắn hơn! –

+0

@MarkRobinson vui vì tôi có thể giúp – deltree

+0

cảm ơn vì câu trả lời này, sẽ thử nó sớm ... chỉ muốn cho bạn biết rằng ref ko trong jsFiddle đã chết. Được sử dụng thay thế này - http://cdnjs.cloudflare.com/ajax/libs/knockout/2.3.0/knockout-min.js –

14

Bạn có thể thêm một phương pháp toJSON sang mô hình quan điểm của bạn và sử dụng để loại bỏ tất cả các thuộc tính không cần thiết:

ViewModel.prototype.toJSON = function() { 
    var copy = ko.toJS(this); 
    // remove any unneeded properties 
    if (copy.unneedProperty == null) { 
     delete copy.unneedProperty; 
    } 
    return copy; 
} 

Bạn có thể có thể tự động hoá nó để chạy qua tất cả các thuộc tính của bạn và xóa những cái rỗng .

+0

Cảm ơn câu trả lời Matt nhưng tôi nghĩ rằng điều này hoạt động nhiều hơn nếu tài sản KHÔNG BAO GIỜ được chuyển đổi sang JSON thay vì trong trường hợp của tôi, nơi tôi chỉ muốn chuyển đổi thuộc tính sang JSON khi giá trị của nó không phải là rỗng. –

+2

@MarkRobinson: Không phải như vậy, bạn kiểm tra nếu nó là null, và chỉ xóa nó nếu nó được. Tôi sẽ chỉnh sửa câu trả lời của mình để làm rõ điều này. –

+1

Cảm ơn bạn đã làm rõ, Matt. Cách tiếp cận sửa đổi sẽ hoạt động. Lợi thế của phương pháp tiếp cận của bạn dường như là nó cung cấp kiểm soát tốt hơn hạt mà tài sản có giá trị null của họ bị bỏ qua nhưng @deltree trả lời hoạt động trên toàn cầu chỉ với một vài dòng mã phù hợp với tình hình của tôi tốt hơn. 1 anyway cho một cách tiếp cận hữu ích. –

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