program tip

정의되지 않은 JSON.stringify를 유지하면 그렇지 않으면 제거됩니다.

radiobox 2020. 12. 24. 23:33
반응형

정의되지 않은 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

반응형