2013-05-20 30 views
11

Tôi đã Object JavaScript nói:JSON.stringify chuyển đổi Infinity null

var a = {b: Infinity, c: 10}; 

Khi tôi làm

var b = JSON.stringify(a); 

nó trả về sau

b = "{" b ": null , "c": 10} ";

JSON.stringify chuyển đổi đối tượng thành chuỗi như thế nào?

Tôi đã thử MDN Solution.

function censor(key, value) { 
    if (value == Infinity) { 
    return "Infinity"; 
    } 
    return value; 
} 
var b = JSON.stringify(a, censor); 

Nhưng trong trường hợp này, tôi phải trả lại chuỗi "Infinity" không Infinity. Nếu tôi trở lại Infinity nó lại chuyển đổi Infinity thành null.

Làm cách nào để giải quyết vấn đề này.

Trả lời

9

Giống như câu trả lời khác nói, Infintity không phải là một phần của giá trị JSON có thể lưu trữ như giá trị.

Bạn có thể đảo ngược các phương pháp kiểm duyệt trên phân tích cú pháp JSON:

var c = JSON.parse(
      b, 
      function (key, value) { 
      return value === "Infinity" ? Infinity : value; 
      } 
     ); 
+0

này tôi luôn có thể làm, nhưng nó sẽ được tốt đẹp để có được những Infinity không "Infinity", như tôi không cần phải thực hiện điều này kiểm tra thêm về hàng trăm đối tượng của tôi có hàng trăm thuộc tính. –

+0

Như tôi đã viết trong câu trả lời của tôi, một tệp JSON chứa 'Infinity' (không có dấu ngoặc kép) làm giá trị sẽ không là JSON hợp lệ. Bạn không nên viết các tệp JSON không tuân thủ chuẩn. – JohnB

+0

@DigvijayYadav, tôi e rằng bạn sẽ phải sống với bản chất của con thú. – KooiInc

5

JSON không có Infinity hoặc NaN, xem câu hỏi này:

JSON left out Infinity and NaN; JSON status in ECMAScript?

Do đó { b: Infinity, c: 10 } không phải là JSON hợp lệ. Nếu bạn cần để mã hóa vô cực trong JSON, bạn có thể phải nghỉ mát để các đối tượng:

{ 
    "b": { "is_infinity": true, "value": null }, 
    "c": { "is_infinity": false, "value": 10 } 
} 

Cấu trúc này được tạo ra bởi, cho ví dụ trên bạn làm những gì bạn nói có,

function censor(key, value) { 
    if (value == Infinity) { 
    return JSON.stringify ({ is_infinity: true, value: null }); 
    } else { 
    return JSON.stringify ({ is_infinity: false, value: value }); 
    } 
} 
var b = JSON.stringify(a, censor); 
Các vấn đề liên quan