2013-03-27 2 views
0

Мне нужно получить доступ и провести серию операций над большим json-объектом. Некоторые вещи, которые мне нужно читать и изменять очень глубоко в дерево с путями, такими как:Создать строковый ключ для сложного пути json

result.project.properties[0]['hudson.model.ParametersDefinitionProperty'][0].parameterDefinitions[0]['hudson.model.BooleanParameterDefinition'] 

Этот путь является то, что я буду ссылаться снова и снова. Я хотел бы быть в состоянии сделать что-то вроде:

key = "project.properties[0]['hudson.model.ParametersDefinitionProperty'] [0].parameterDefinitions[0]['hudson.model.BooleanParameterDefinition']" 

так что я могу потом читать и писать или на пути, как это:

result[key] 

но узел даже не работает с:

result['project.properties'] 

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

Есть ли хороший способ сделать путь многоразовым без необходимости вводить все это более одного раза?

ответ

2

result[key] относится к объекту (ключ), который вы инициализирован, как:

key = "project.properties[0]['hudson.model.ParametersDefinitionProperty'] [0].parameterDefinitions[0]['hudson.model.BooleanParameterDefinition']" 

В вашем объекте JSON, нет объекта с таким большим именем, поэтому он не работает. Если вы хотите, чтобы не впечатать, что все это, попробуйте следующее:

shortResult = result.project.properties[0]['hudson.model.ParametersDefinitionProperty'][0].parameterDefinitions[0]['hudson.model.BooleanParameterDefinition']; 

здесь вы можете получить доступ к вещам, которые находятся внутри «BooleanParameterDefinition».

+0

правый, но не по справке. «shortResult» будет просто копией BooleanParameterDefinition, поэтому изменения в ней будут применяться только к этой копии, а не к исходному объекту json. Поэтому мне по существу пришлось бы снова напечатать этот весь адрес объекта json, чтобы установить его равным shortResult. Это то, чего я надеюсь избежать. – kcgolden

+0

Я ошибся. shortResult оказывается ссылкой на эту точку в объекте, поэтому написание «shortResult =» означает то же самое, что печатать весь путь и устанавливать его равным чему-то, поэтому ваш ответ работает. Я действительно написал это решение, прежде чем задал вопрос, но только сделал предположение, что он не сработает. Извини за это. – kcgolden

1

Вы пробовали что-то вроде

var reference = result.project.properties[0]['hudson.model.ParametersDefinitionProperty'][0].parameterDefinitions[0]['hudson.model.BooleanParameterDefinition']; 

Это будет держать ссылку на это «местоположение» в вашем более крупном объекте, и вы можете ссылаться на атрибуты внутри как reference[attribute].

Причина, по которой result['project.properties'] не работает, заключается в том, что она ищет атрибут с ключом «project.properties», который у вашего объекта нет.

+0

Единственная проблема заключается в том, что это не ссылка, а копия этого места. Если я хочу изменить элементы в более крупном объекте json, я должен каждый раз набирать этот длинный адрес. – kcgolden

+0

Я не верю, что это правильно. Если я ошибаюсь (это возможно, потому что я долго не просыпался), javascript сохраняет объект по ссылке, если вы явно не делаете его глубокой копии. –

+0

Нет, вы можете легко проверить это для себя, сделав объект, ссылаясь на него, внося изменения в один и регистрируя другое. –

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

  • Нет связанных вопросов^_^