2016-11-02 2 views
2

Есть ли способ использовать функцию JSON.parse для свойств или функций ADD для вновь созданных объектов (независимо от уровня их вложенности)?JSON.parse добавить собственность или func?

Использование опции reviver (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) Насколько я понимаю, я могу отказаться от свойств, которые не нужны или не заботятся при разборе json.

JSON.parse(
'{"name":"toplevel",'+ 
' "gibberish":"...",'+ 
' "children":['+ 
' {"name":"child1",'+ 
' "gibberish":"..."'+ 
' },'+ 
' {"name":"child2",'+ 
' "gibberish":"..."'+ 
' }'+ 
' ]'+ 
'}' 
,(key,value)=>{ 
if (key=="gibberish") 
{ 
    return undefined; 
} 
return value 
}); 

=> 
{"name":"toplevel" 
"children":[ 
    {"name":"child1"}, 
    {"name":"child2"} 
] 
} 

код выше удаляет свойство тарабарщины всех созданных объектов. Теперь Что я могу сделать, чтобы добавить свойство (скажем, uniqueID)?

Должен ли я снова пересечь дерево объектов? (и иметь дело с typeOf (и его ошибкой), чтобы угадать, является ли свойство объектом, а не null или Array или ...)

+1

После того как вы разобрали его, его объект JS. Затем вы можете добавить все, что захотите, включая добавление свойств. – Amy

+0

Моя проблема в гнездовании. Я хочу добавить funcs на все объекты независимо от того, насколько они глубоки. – frenchone

+0

Что вы подразумеваете _I хочу добавить funcs на все объекты Object_? Можете ли вы добавить образец вывода? – Grundy

ответ

0

Вы можете создать класс, который по вашему желанию, а затем присвоить данные JSON экземпляр.

function Class() {...} 
Class.prototype.accept = function(visitor) {...}; 
Class.prototype.copyFromJSON = function() { 
    delete this.gibberish; 
    this.children = this.children.map(function(child) { 
     child = Object.assign(new ChildClass, child); 
     child.copyFromJSON(); 
     return child; 
    }); 
}; 
function ChildClass() {...} 
ChildClass.prototype.copyFromJSON = function() { 
    delete this.gibberish; 
    ... 
} 
var instance = Object.assign(new Class, JSON.parse(json)); 
instance.copyFromJSON(); 
+0

Это будет работать только для экземпляра верхнего уровня. Я ищу что-то, что обрабатывает гнездование. – frenchone

+0

См. Обновленный пример выше. Вам нужно реализовать вложенное поведение для назначения типов данным JSON. Один из вариантов заключается в использовании 'Object.create (Class.prototype)', если вам нужно избегать вызова конструктора. – JohnLock

Смежные вопросы