JSON.stringify() 출력 중 특정 값 숨기기
특정 필드를 json 문자열에 포함시키지 않을 수 있습니까?
여기 몇 가지 유사 코드가 있습니다.
var x = {
x:0,
y:0,
divID:"xyz",
privateProperty1: 'foo',
privateProperty2: 'bar'
}
privateProperty1 및 privateproperty2가 json 문자열에 표시되지 않도록 합니다.
그래서 저는 Stringify refacer 기능을 사용할 수 있다고 생각했습니다.
function replacer(key,value)
{
if (key=="privateProperty1") then retun "none";
else if (key=="privateProperty2") then retun "none";
else return value;
}
그리고 스트링라이프 안에
var jsonString = json.stringify(x,replacer);
그러나 jsonString에서는 여전히 다음과 같이 표시됩니다.
{...privateProperty1:value..., privateProperty2:value }
사재기 없는 문자열로 하겠습니다.
Mozilla 문서는 반환을 지시합니다.undefined
)"none"
http://jsfiddle.net/userdude/rZ5Px/
function replacer(key,value)
{
if (key=="privateProperty1") return undefined;
else if (key=="privateProperty2") return undefined;
else return value;
}
var x = {
x:0,
y:0,
divID:"xyz",
privateProperty1: 'foo',
privateProperty2: 'bar'
};
alert(JSON.stringify(x, replacer));
다음으로 (코멘트에 따라) 그 루트를 선택했을 경우의 복제 방법을 나타냅니다.
http://jsfiddle.net/userdude/644sJ/
function omitKeys(obj, keys)
{
var dup = {};
for (var key in obj) {
if (keys.indexOf(key) == -1) {
dup[key] = obj[key];
}
}
return dup;
}
var x = {
x:0,
y:0,
divID:"xyz",
privateProperty1: 'foo',
privateProperty2: 'bar'
};
alert(JSON.stringify(omitKeys(x, ['privateProperty1','privateProperty2'])));
편집 - 헷갈리지 않도록 하단 기능의 기능 키를 변경했습니다.
또 다른 좋은 솔루션: (밑줄 필요)
x.toJSON = function () {
return _.omit(this, [ "privateProperty1", "privateProperty2" ]);
};
이 솔루션의 장점은 x에서 JSON.stringify를 호출하면 누구나 올바른 결과를 얻을 수 있다는 것입니다.JSON.stringify 콜을 개별적으로 변경할 필요가 없습니다.
언더스코어 이외의 버전:
x.toJSON = function () {
var result = {};
for (var x in this) {
if (x !== "privateProperty1" && x !== "privateProperty2") {
result[x] = this[x];
}
}
return result;
};
오브젝트에서 네이티브 함수 defineProperty를 사용할 수 있습니다.
var data = {a: 10};
Object.defineProperty(data, 'transient', {value: 'static', writable: true});
data.transient = 'dasda';
console.log(JSON.stringify(data)); //{"a":10}
이것은 오래된 질문이지만, 훨씬 더 간단한 방법이 있기 때문에 답변을 덧붙입니다.JSON에서 출력할 문자열 배열을 전달합니다.
var x = {
x:0,
y:0,
divID:"xyz",
privateProperty1: 'foo',
privateProperty2: 'bar'
}
JSON.stringify(x, ["x", "y", "divID"]);
// This will output only x y and divID
// {"x":0,"y":0,"divID":"xyz"}
과 같습니다....
const obj = {
name: "hello",
age: 42,
id: "3942"
};
const objWithoutId = { ...obj, id: undefined };
const jsonWithoutId = JSON.stringify(objWithoutId);
console.log(jsonWithoutId);
이미 답변이 끝난 질문이라는 것을 알고 있습니다만, 설치 오브젝트를 사용할 때 덧붙이고 싶은 것이 있습니다.
함수를 사용하여 할당하면 JSON.stringify() 결과에 포함되지 않습니다.
이 함수는 함수로 끝납니다.()
var MyClass = function(){
this.visibleProperty1 = "sample1";
this.hiddenProperty1 = function(){ return "sample2" };
}
MyClass.prototype.assignAnother = function(){
this.visibleProperty2 = "sample3";
this.visibleProperty3 = "sample4";
this.hiddenProperty2 = function(){ return "sample5" };
}
var newObj = new MyClass();
console.log( JSON.stringify(newObj) );
// {"visibleProperty1":"sample1"}
newObj.assignAnother();
console.log( JSON.stringify(newObj) );
// {"visibleProperty1":"sample1","visibleProperty2":"sample3","visibleProperty3":"sample4"}
console.log( newObj.visibleProperty2 ); // sample3
console.log( newObj.hiddenProperty1() ); // sample2
console.log( newObj.hiddenProperty2() ); // sample5
또한 고정된 객체가 아닌 경우에도 개념을 가지고 놀 수 있습니다.
더 쉬운 방법.
- 변수를 만들고 빈 배열을 할당합니다.그러면 객체가 배열의 프로토타입이 됩니다.
- 이 개체에 숫자가 아닌 키를 추가합니다.
- JSON.stringify를 사용하여 이 개체를 직렬화합니다.
- 이 개체에서는 아무것도 일련화되지 않았습니다.
~~~
var myobject={
a:10,
b:[]
};
myobject.b.hidden1 = 'hiddenValue1';
myobject.b.hidden2 = 'hiddenValue2';
//output of stringify
//{
// "a": 10,
// "b": []
//}
~~~
http://www.markandey.com/2015/07/how-to-hide-few-keys-from-being-being.html
Object.create는 defineProperty 솔루션(속성은 같은 방법으로 정의됨)에 가까운 또 다른 솔루션이지만 이 방법으로 처음부터 표시할 속성을 정의합니다.할 수 .을 설정할 수 있습니다.enumerable
값이 true(기본값으로는 false), JSON.stringify는 열거할 수 없는 속성을 무시합니다.단점으로는 오브젝트 또는 Object.keys 등의 함수에서 for-in 루프를 사용할 때 이 속성도 숨겨집니다.
var x = Object.create(null, {
x: {value:0, enumerable: true},
y:{value: 0, enumerable: true},
divID: {value: 'xyz', enumerable: true},
privateProperty1: {value: 'foo'},
privateProperty2: {value: 'bar'}
});
JSON.stringify(x)
//"{"x":0,"y":0,"divID":"xyz"}"
Miroslaw Dylag의 답변은 다음과 같습니다.정의된 속성은 자체 속성이어야 합니다.그렇지 않으면 실패할 것이다.
동작하지 않음:
class Foo {
}
Object.defineProperty(Foo.prototype, 'bar', { value: 'bar', writable: true });
const foo = new Foo();
foo.bar = 'baz';
alert(JSON.stringify(foo).indexOf('bar') === -1); // false (found)
동작:
class Foo {
constructor() {
Object.defineProperty(this, 'bar', { value: 'bar', writable: true });
}
}
const foo = new Foo();
foo.bar = 'baz';
alert(JSON.stringify(foo).indexOf('bar') === -1); // true (not found)
다음은 Internet Explorer를 지원하지 않는 다른 방법입니다.
const privateProperties = ["privateProperty1", "privateProperty2"];
const excludePrivateProperties = (key, value) => privateProperties.includes(key) ? undefined : value;
const jsonString = JSON.stringify(x, excludePrivateProperties);
abstract class Hideable {
public hidden = [];
public toJSON() {
var result = {};
for (var x in this) {
if(x == "hidden") continue;
if (this.hidden.indexOf(x) === -1) {
result[x] = this[x];
}
}
return result;
};
}
ES2017로 쉽게 할 수 있습니다.
let {privateProperty1:exc1, privateProperty2:exc2, ...foo} = {
x:0,
y:0,
divID:"xyz",
privateProperty1: 'foo',
privateProperty2: 'bar'
}
여기서privateProperty1
그리고.privateProperty2
에 할당되어 있다.exc1
그리고.exc2
따라서.나머지 부분은 에 할당됩니다.foo
새로 생성된 변수
나는 J를 했다.런타임에 타이핑을 받기 위해 작성한 작은 라이브러리를 기반으로 한 SON 솔루션 https://stackoverflow.com/a/55917109/4236151
델의 토픽 https://stackoverflow.com/a/62457745/14491024에 가입하고 있습니다.이 토픽은 제 코드에 도움이 되었습니다.
JSON.stringify(GetMyContent[i], ["mdlPageName", "mdlAligen", "mdlOrderNumberHorizontal", "mdlPageId", "mdlOrderNumberVertical"])
이렇게 하면 필요한 속성을 선택할 수 있습니다.
if (GetMyContent[i].mdlAligen == "Left") {
var getrownum = GetMyContent[i].mdlOrderNumberHorizontal;
if ($('.Left div.row:eq(' + (getrownum - 1) + ')').children().length > 0) {
$('.Left div.row:eq(' + (getrownum - 1) + ')').append("<div id=" + GetMyContent[i].mdlPageId + " class=\"border border-secondary col\" " + "data-atrrib=" + JSON.stringify(GetMyContent[i], ["mdlPageName", "mdlAligen", "mdlOrderNumberHorizontal", "mdlPageId", "mdlOrderNumberVertical"]) + ">" + GetMyContent[i].mdlPageContentHtml + buttonEDI + "</div>");
}
else {
$('.Left div.row:last').html("<div id=" + GetMyContent[i].mdlPageId + " class=\"border border-secondary col\" " + "data-atrrib=" + JSON.stringify(GetMyContent[i], ["mdlPageName", "mdlAligen", "mdlOrderNumberHorizontal", "mdlPageId", "mdlOrderNumberVertical"]) + ">" + GetMyContent[i].mdlPageContentHtml + buttonEDI + "</div>");
$(".Left .row:last").after($('.Left .row:eq(0)').clone().html(""));
}
}
J에 더해SON 및 리페이서간단한 수정은 변수를 'static' 변수로 변환하는 것입니다.정적 변수는 프로토타입 변수로 추가되므로 JSON 문자열에는 포함되지 않습니다.
주의:변수가 정적 변수일 수 있는 경우 이 옵션을 사용하십시오.
removes
는 생략할 키의 배열입니다. space
예쁜 인쇄에는 옵션입니다.
// typescript version
export function toJson<T>(me: T, removes?: (keyof T)[], space?: number): string {
return JSON.stringify(me, (k, v) => (removes?.some((r) => r === k) ? undefined : v), space);
}
// javascript version
export function toJson(me , removes , space) {
return JSON.stringify(me, (k, v) => (removes?.some((r) => r === k) ? undefined : v), space);
}
예
const data = {name: "ali" ,age: "80"};
console.log(toJson(data, ["age"]))
// output: {"name":"ali"}
언급URL : https://stackoverflow.com/questions/4910567/hide-certain-values-in-output-from-json-stringify
'programing' 카테고리의 다른 글
Formik 양식을 사용한 리액트 날짜 선택기 (0) | 2023.04.01 |
---|---|
세금 라인이 아닌 카트 합계에만 woocommerce 쿠폰을 적용하십시오. (0) | 2023.04.01 |
메뉴 구분 막대로 작성하는데 첫 번째 항목과 마지막 항목에 막대가 없는 방법? (0) | 2023.04.01 |
렌더링 시 onClick이 호출되는 이유는 무엇입니까? - React.js (0) | 2023.04.01 |
Python을 사용하여 RESTful 서비스에서 JSON 데이터를 얻는 방법은 무엇입니까? (0) | 2023.04.01 |