是否可以排除某些字段包含在json字符串中?
这是一些伪代码
var x = {
x:0,
y:0,
divID:"xyz",
privateProperty1: 'foo',
privateProperty2: 'bar'
}
我想排除privateProperty1和privateproperty2出现在json字符串中
所以我想,我可以使用stringify替换器功能
function replacer(key,value)
{
if (key=="privateProperty1") then retun "none";
else if (key=="privateProperty2") then retun "none";
else return value;
}
并在stringify中
var jsonString = json.stringify(x,replacer);
但在jsonString中我仍然将其视为
{...privateProperty1:value..., privateProperty2:value }
我想要没有privateproperties的字符串。
答案 0 :(得分:83)
Mozilla docs说要返回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'])));
编辑 - 我更改了底部功能中的功能键,以防止混淆。
答案 1 :(得分:21)
另一个好的解决方案:(需要下划线)
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;
};
答案 2 :(得分:14)
您可以使用Object:
中的本机函数 definePropertyvar data = {a: 10};
Object.defineProperty(data, 'transient', {value: 'static', writable: true});
data.transient = 'dasda';
console.log(JSON.stringify(data)); //{"a":10}
答案 3 :(得分:3)
更容易的方法。
~~~
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
答案 4 :(得分:2)
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"}"
答案 5 :(得分:1)
Miroslaw Dylag' s answer的注意事项:已定义的属性应为其自己的属性。否则就会失败。
不能工作:
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)
答案 6 :(得分:1)
这是一个古老的问题,但是我要添加一个答案,因为有一个更简单的方法可以解决这个问题。传递要在JSON中输出的字符串数组。
import numpy as np
答案 7 :(得分:0)
我知道这已经是一个已回答的问题,但我想在使用实例化对象时添加一些内容。
如果使用函数指定它,它将不会包含在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
即使没有在实例化的对象上,你也可以使用这个概念。
答案 8 :(得分:0)
print my['data']['tasks']
答案 9 :(得分:0)
您可以使用ES2017轻松完成
let {privateProperty1:exc1, privateProperty2:exc2, ...foo} = {
x:0,
y:0,
divID:"xyz",
privateProperty1: 'foo',
privateProperty2: 'bar'
}
此处privateProperty1
和privateProperty2
被分别分配给exc1
和exc2
。其余的分配给foo
新创建的变量
答案 10 :(得分:0)
我已经使用基于我编写的小型库的JSON解决方案,以便在运行时进行https://stackoverflow.com/a/55917109/4236151的输入
答案 11 :(得分:0)
这是另一种方法,尽管没有Internet Explorer支持。
const privateProperties = ["privateProperty1", "privateProperty2"];
const excludePrivateProperties = (key, value) => privateProperties.includes(key) ? undefined : value;
const jsonString = JSON.stringify(x, excludePrivateProperties);
答案 12 :(得分:0)
这是我使用点差运算符(...)的方法:
const obj = { name:"hello", age:42, id:"3942" };
const objWithoutId = { ...o, id: undefined }
const jsonWithoutId = JSON.stringify({...o, id:undefined});
答案 13 :(得分:0)
我订阅了 delp 的主题 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(""));
}
}