programing

JSON.stringify() 출력 중 특정 값 숨기기

i4 2023. 4. 1. 08:28
반응형

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

또한 고정된 객체가 아닌 경우에도 개념을 가지고 놀 수 있습니다.

더 쉬운 방법.

  1. 변수를 만들고 빈 배열을 할당합니다.그러면 객체가 배열의 프로토타입이 됩니다.
  2. 이 개체에 숫자가 아닌 키를 추가합니다.
  3. JSON.stringify를 사용하여 이 개체를 직렬화합니다.
  4. 이 개체에서는 아무것도 일련화되지 않았습니다.

~~~

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

반응형