2014-10-24 16 views
25

JSON.stringify (hash) yapılırken tanımsız değerleri nasıl korurum?JSON.stringify öğesinin aksi durumda kaldırılmayacağının korunması

İşte bir örnek:

var hash = { 
    "name" : "boda", 
    "email" : undefined, 
    "country" : "africa" 
}; 

var string = JSON.stringify(hash); 

> "{"name":"boda","country":"africa"}" 

Eposta JSON.stringify kayboldu.

+11

JSON, tanımlanmamış değere sahip değildir. Ne istiyorsun? – SLaks

+4

Değeri "" tanımlanmamış "veya belki" boş "veya boş bir dizge" "" 'olarak değiştirmeniz gerekir. Bunu nasıl tercih ederdiniz? –

+3

http://json.org/ adresine bakınız. Standart değerde 'string', 'number',' object', 'array',' true', 'false' veya' null' dır. Undefined 'seçeneğinin bir seçenek olmadığını unutmayın. –

cevap

6

undefined yerine null kullanın.

var hash = { 
    "name" : "boda", 
    "email" : null, 
    "country" : "africa" 
}; 

var string = JSON.stringify(hash); 

> "{"name":"boda","email":null,"country":"africa"}" 
42

Böyle otomatik null değerlere undefined değerlerini dönüştürmek için JSON.stringify bir ikame işlevini geçirebilirsiniz: zaten bu dönüştürür JSON.stringify olarak

Bu durum diziler içindeki tanımsız değerler için çalışır
var string = JSON.stringify(
    obj, 
    function(k, v) { if (v === undefined) { return null; } return v; } 
); 

, null.

+4

ES6: JSON.stringify (obj, (k, v) => v === undefined? null: v)' – ricka

+1

bu sırada Sorunu çözmediği bir çözümdür, değeri undefined olarak koruduğu için, null olarak değiştirir. – Peter

+0

@Peter JSON yalnızca "null" değerlerine izin verir, JSON standardında tanımlanmış "undefined" değeri yoktur. – Flimm

1

Burada satırlar arasında okuma yapıyorum ve JSON.parse kullandığınızda değerin undefined olmasını istediğinizi tahmin ediyorum?

o aşağıdaki kullanabilirsiniz durumda:

var encodeUndefined = function(obj, undefinedPaths, path) { 
    path = path || 'ROOT'; 
    for (var key in obj) { 
    var keyPath = path + '.' + key; 
    var value = obj[key]; 
    if (value === undefined) { 
     undefinedPaths.push(keyPath); 
    } else if (typeof value == "object" && value !== null) { 
     encodeUndefined(obj[key], undefinedPaths, keyPath); 
    } 
    } 
} 

var stringifyAndPreserveUndefined = function(obj) { 
    var undefinedPaths = []; 
    //save all paths that have are undefined in a array. 
    encodeUndefined((obj), undefinedPaths); 
    return JSON.stringify({ 
    ROOT: obj, 
    undefinedPaths: undefinedPaths 
    }, function(k, v) { if (v === undefined) { return null; } return v; }); 
} 

var parseAndRestoreUndefined = function(value) { 
    var data = JSON.parse(value); 
    var undefinedPaths = data.undefinedPaths; 
    var obj = data.ROOT; 
    //Restore all undefined values 
    for (var pathIndex = 0; pathIndex < undefinedPaths.length; pathIndex++) { 
    var pathParts = undefinedPaths[pathIndex].substring(5).split('.'); 
    var item = obj; 
    for (var pathPartIndex = 0; pathPartIndex < pathParts.length - 1; pathPartIndex++) { 
     item = item[pathParts[pathPartIndex]]; 
    } 
    item[pathParts[pathParts.length - 1]] = undefined; 
    } 
    return obj; 
} 

var input = { 
    test1: 'a', 
    test2: 'b', 
    test3: undefined, 
    test4: { 
    test1: 'a', 
    test2: undefined 
    } 
}; 
var result = stringifyAndPreserveUndefined(input); 
var result2 = parseAndRestoreUndefined(result); 

stringifyAndPreserveUndefined bir dizideki tüm tanımsız değerleri kodlar ve parseAndRestoreUndefined çağırdığınızda tekrar doğru yerde sokacak.

Bir dezavantajı, json, nesneye tam olarak benzemeyecektir. örnekte {"ROOT":{"test1":"a","test2":"b","test4":{"test1":"a"}},"undefinedPaths":["ROOT.test3","ROOT.test4.test2"]}

+1

Uzun çözüm, ancak en azından çalışır. (Benim durumumda, sadece "null dönüşüme" yaklaşımını kullanıyorum, çünkü json olarak "undefined" olarak korunmasına gerek yok) – Venryx

0
function stringifyWithUndefined(obj, space) { 
    const str = JSON.stringify(obj, (key, value) => value === undefined ? '__undefined__' : value, space); 
    return str.replace(/"__undefined__"/g, 'undefined'); 
} 

Örnek dönüşecek yukarıda:

const obj = { 
    name: 'boda', 
    email: undefined, 
    country: 'africa' 
}; 
console.log(stringifyWithUndefined(obj, 2)); 

Sonuç:

{ 
    "name": "boda", 
    "email": undefined, 
    "country": "africa" 
} 
İlgili konular