在Ruby中向现有的JSON数组追加新值

3

我是新手Ruby。 我有一个如下格式的现有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"
          }
        ]
      }
    ]
  }
}

我正在我的 Ruby 程序中读取这个文件,并想要将另一种情况添加到这个文件中。例如:

{
  "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 `[]=' for nil:NilClass (NoMethodError)。@scenario变量只出现了1次,不允许我添加第二个出现的情况。

请有经验的人帮我解决这个问题。

2个回答

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

Surya,很抱歉上面的解决方案只能部分地发挥作用。它可以修复场景数组的问题,但不能解决测试用例数组的问题。 - Anoop

0
@scenario中,您有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


嗨Lukas,我已经尝试过使用这种方法,但它没有起作用。它只是用新的对象替换了场景中的当前对象。Surya发布的答案有效。 - Anoop
无论如何,感谢您的回复。非常感激您的时间。 - Anoop
嗨,Lukas。我又尝试了一下你的解决方案,它可以用。唯一需要调整的是TestCase变量的长引用以使它们能够动态设置。 new_scenario ['TestCase'] [0] ['TestCaseNumber'] = 2 - Anoop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接