【问题标题】:Append new values to an existing JSON array in ruby将新值附加到 ruby​​ 中的现有 JSON 数组
【发布时间】:2017-05-19 14:32:35
【问题描述】:

我是红宝石新手。我有一个以下格式的现有 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 次,它不允许我添加第二次出现。

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: arrays json ruby


    【解决方案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 抱歉,上述解决方案仅部分有效。它解决了场景数组的问题,但没有解决测试用例数组的问题
    【解决方案2】:

    @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 发布的答案奏效了。
    • 无论如何感谢您的回复。感谢您的时间。
    • 嗨 Lukas,我再次尝试了您的解决方案,它成功了。我必须做的唯一调整是 TestCase 变量的长引用以动态设置它们。 new_scenario['TestCase'][0]['TestCaseNumber'] = 2
    猜你喜欢
    • 2015-05-16
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 2011-11-19
    相关资源
    最近更新 更多