2017-01-05 3 views
3

Я новичок в рубине. У меня есть существующий JSON-файл в следующем формате.Добавить новые значения в существующую массив JSON в рубине

{ 
    "ASRtest": { 
    "ASRHDR": "This is asr HDR", 
    "ASRTestType": "DevTest", 
    "Scenario": [ 
     { 
     "ScenarioNumber": 1, 
     "ScenarioName": "HTTP Validation", 
     "ScenarioDescription": "Validate if the API alows access over HTTP", 
     "ScExecutionStatus": "Execution Complete", 
     "ScenarioStatus": "In-Complete", 
     "ScenarioSeverity": false, 
     "TestCase": [ 
      { 
      "TestCaseNumber": 1, 
      "TestCaseName": "HTTP Validation - using POST method ", 
      "TcExecutionStatus": "Execution Error", 
      "TcStatus": "NA", 
      "TcSeverity": "NA" 
      } 
     ] 
     } 
    ] 
    } 
} 

Я читаю этот файл в моей рубиновой программе и хочу другой сценарий к этому файлу Как

{ 
    "ASRtest": { 
    "ASRHDR": "This is asr HDR", 
    "ASRTestType": "DevTest", 
    "Scenario": [ 
     { 
     "ScenarioNumber": 1, 
     "ScenarioName": "HTTP Validation", 
     "ScenarioDescription": "Validate if the API alows access over HTTP", 
     "ScExecutionStatus": "Execution Complete", 
     "ScenarioStatus": "In-Complete", 
     "ScenarioSeverity": false, 
     "TestCase": [ 
      { 
      "TestCaseNumber": 1, 
      "TestCaseName": "HTTP Validation - using POST method ", 
      "TcExecutionStatus": "Execution Error", 
      "TcStatus": "NA", 
      "TcSeverity": "NA" 
      } 
     ] 
     }, 
     { 
     "ScenarioNumber": 2, 
     "ScenarioName": "SC2", 
     "ScenarioDescription": "Desc", 
     "ScExecutionStatus": "Execution Complete", 
     "ScenarioStatus": "In-Complete", 
     "ScenarioSeverity": false, 
     "TestCase": [ 
      { 
      "TestCaseNumber": 1, 
      "TestCaseName": "Some Name ", 
      "TcExecutionStatus": "Execution Error", 
      "TcStatus": "NA", 
      "TcSeverity": "NA" 
      } 
     ] 
     } 
    ] 
    } 
} 

Я прочитал файл, используя приведенный ниже код

@template_file = JSON.parse(File.read('SummaryTemplate.json')) 
@ASR_Test = @template_file['ASRtest'] 
@ASR_Test 
@scenario = @ASR_Test['Scenario'] 

, когда я попробуйте приведенный ниже код

@scenario[1]['ScenarioNumber'] = 2 

это дает мне ошибку undefined method `[] = 'для nil: NilClass (NoMethodError) переменная @scenario имеет только 1 вхождение, и это не позволяет мне добавить второе вхождение.

Не могли бы вы помочь мне с этой проблемой.

ответ

0

В @scenario у вас есть Array объект, так что если вы хотите, чтобы добавить новый хэш внутри этого массива, просто использовать Array#<< метод, как это.

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

new_scenario = { 
    "ScenarioNumber" => 2, 
    "ScenarioName" => "SC2", 
    "ScenarioDescription" => "Desc", 
    "ScExecutionStatus" => "Execution Complete", 
    "ScenarioStatus" => "In-Complete", 
    "ScenarioSeverity" => false, 
    "TestCase" => [ 
    { 
     "TestCaseNumber" => 1, 
     "TestCaseName" => "Some Name ", 
     "TcExecutionStatus" => "Execution Error", 
     "TcStatus" => "NA", 
     "TcSeverity" => "NA" 
    } 
    ] 
} 

@scenario << new_scenario 

@template_file теперь включают new_scenario

+0

Привет, Лукас. Я уже пытался использовать этот подход, и это не сработало. Он просто заменяет текущий объект в сценарии новым. Ответ, написанный Сурья, сработал. – Anoop

+0

В любом случае спасибо за ваш ответ. Цените свое время. – Anoop

+0

Hi Lukas Я снова попробовал ваше решение, и это сработало. Единственная настройка, которую я должен был сделать, - это длинная ссылка переменной TestCase для динамической настройки. new_scenario ['TestCase'] [0] ['TestCaseNumber'] = 2 – Anoop

1

Это потому, что от @scenario = @ASR_Test['Scenario'], @scenario будет:

[ 
    { 
    "ScenarioNumber": 1, 
    "ScenarioName": "HTTP Validation", 
    "ScenarioDescription": "Validate if the API alows access over HTTP", 
    "ScExecutionStatus": "Execution Complete", 
    "ScenarioStatus": "In-Complete", 
    "ScenarioSeverity": false, 
    "TestCase": [ 
     { 
     "TestCaseNumber": 1, 
     "TestCaseName": "HTTP Validation - using POST method ", 
     "TcExecutionStatus": "Execution Error", 
     "TcStatus": "NA", 
     "TcSeverity": "NA" 
     } 
    ] 
    } 
] 

и говорит @scenario[1] будет производить: nil

Это означает, вызывая @scenario[1]['ScenarioNumber'] поднимет исключение говоря:

`[]=' for nil:NilClass (NoMethodError) the variable @scenario 

Для решения это, вам нужно будет добавить объект Hash на Данный индекс:

@scenario[1] = {} 

, то ваш код работал бы:

@scenario[1]['ScenarioNumber'] = 2 
+0

Большое спасибо Surya. Это сработало. – Anoop

+0

как его принять. Хорошо, только что нашел. – Anoop

+0

Surya жаль, что вышеупомянутое решение работает только частично. Он исправляет проблему с помощью массива сценариев, но не решает проблему с массивом testcase. – Anoop

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