정의되지 않은 JSON.stringify를 유지하면 그렇지 않으면 제거됩니다.
JSON.stringify (hash)를 수행 할 때 정의되지 않은 값을 어떻게 보존합니까?
예를 들면 다음과 같습니다.
var hash = {
"name" : "boda",
"email" : undefined,
"country" : "africa"
};
var string = JSON.stringify(hash);
> "{"name":"boda","country":"africa"}"
JSON.stringify에서 이메일이 사라졌습니다.
다음 과 같이 값을 JSON.stringify
자동으로 undefined
값 으로 변환 하기 위해 replacer 함수를 전달할 수 있습니다 null
.
var string = JSON.stringify(
obj,
function(k, v) { return v === undefined ? null : v; }
);
이것은 배열 내부의 정의되지 않은 값에서도 작동하며 JSON.stringify
이미 null
.
사용 null
대신에 undefined
.
var hash = {
"name" : "boda",
"email" : null,
"country" : "africa"
};
var string = JSON.stringify(hash);
> "{"name":"boda","email":null,"country":"africa"}"
이것은 트릭을 할 것입니다
// Since 'JSON.stringify' hides 'undefined', the code bellow is necessary in
// order to display the real param that have invoked the error.
JSON.stringify(hash, (k, v) => (v === undefined) ? '__undefined' : v)
.replace('"__undefined"', 'undefined')
여기 줄 사이를 읽고 JSON.parse를 사용할 때 정의되지 않은 값을 원한다고 추측합니까?
이 경우 다음을 사용할 수 있습니다.
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
정의되지 않은 모든 값을 배열로 인코딩하고 호출 parseAndRestoreUndefined
하면 올바른 위치에 다시 배치됩니다.
The one downside is the json will not look exactly like the object. In the example above it will turn into {"ROOT":{"test1":"a","test2":"b","test4":{"test1":"a"}},"undefinedPaths":["ROOT.test3","ROOT.test4.test2"]}
function stringifyWithUndefined(obj, space) {
const str = JSON.stringify(obj, (key, value) => value === undefined ? '__undefined__' : value, space);
return str.replace(/"__undefined__"/g, 'undefined');
}
Example:
const obj = {
name: 'boda',
email: undefined,
country: 'africa'
};
console.log(stringifyWithUndefined(obj, 2));
Result:
{
"name": "boda",
"email": undefined,
"country": "africa"
}
You can preserve the key by converting to null since a valid JSON does not allow undefined;
In ES6:
JSON.stringify(obj, (k, v) => v === undefined ? null : v)
Older Browsers
JSON.stringify(obj, function(k,v){return v===undefined ? null : v;})
This will cause it to print as undefined
but this is INVALID json, but is valid JavaScript.
var string = JSON.stringify(obj, function(k,v){return v===undefined?"::undefined::":v}, 2).replace(new RegExp("\"::undefined::\"", 'g'), "undefined");
ReferenceURL : https://stackoverflow.com/questions/26540706/preserving-undefined-that-json-stringify-otherwise-removes
'program tip' 카테고리의 다른 글
How to create an empty matrix in R? (0) | 2020.12.24 |
---|---|
Azure WebJob "다시 시작 보류"는 무엇을 의미합니까? (0) | 2020.12.24 |
XMLHttpRequest 모듈이 정의되지 않음 / 찾음 (0) | 2020.12.24 |
ArrayList.toArray ()의 Java 제네릭 (0) | 2020.12.24 |
따옴표 사이의 경우를 제외하고 Java의 공백에서 문자열 분할 (예 : \ "hello world \"를 하나의 토큰으로 취급) (0) | 2020.12.15 |