Ruby:检查JSON和命名变量

时间:2014-05-08 13:38:27

标签: ruby json

我真的很擅长在Ruby中使用JSON,并且很难弄清楚为什么我正在运行的脚本会生成空白行。让我们说我正在解析一个元素并不总是存在的文件。我想检查该元素是否存在,并且以特定方式取决于结果名称变量。这是我一直在尝试的事情

require 'rubygems'
require 'json'

file = File.open("/path/to/file.json", encoding: 'UTF-8')
json = file.read
data = JSON.parse(json)

if data["snapshots"][-1]["responses"][2].nil?
  item = something
elseif
  item = something else
end

puts item

这不会产生错误,只是产生一个空行。我确定我做了一些明显错误的事情,但我会感激任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

您的主要问题是您有elseif而不是elsif

使用您在下面提供的JSON的完整代码:

require 'json'

json = <<EOS
{
 "snapshots": [
    {
        "steps": 10,
        "responses": [
            {
                "tokens": [
                    "Answer"
                ],
                "questionPrompt": "Question1?"
            },
            {
                "tokens": [
                    "Answer"
                ],
                "questionPrompt": "Question2?"
            },
            {
                "locationResponse": {
                    "location": {
                        "speed": 0,
                        "timestamp": "2014-04-20T17: 28: 37-0400",
                        "longitude": "-xx.xxxxxxx",
                        "latitude": "xx.xxxxxx",
                        "verticalAccuracy": 3,
                        "course": 0,
                        "horizontalAccuracy": 5
                    },
                    "text": "Response"
                },
                "questionPrompt": "Question3?"
            },
            {
                "tokens": [
                    "Answer"
                ],
                "questionPrompt": "Question4?"
            }
        ],
        "battery": 0.75,
        "sectionIdentifier": "1-2014-5-7",
        "audio": {
            "avg": -49.84988,
            "peak": -39.73056
        },
        "background": 0,
        "date": "2014-05-07T23: 20: 57-0400",
        "location": {
            "speed": -1,
            "placemark": {
                "subAdministrativeArea": "County",
                "subLocality": "CityName",
                "thoroughfare": "Street",
                "administrativeArea": "xx",
                "subThoroughfare": "xxx",
                "postalCode": "xxxxx",
                "region": "<+xx.xxxxxx",
                "radius": 28.13,
                "country": "UnitedStates",
                "locality": "CityName",
                "name": "Address"
            },
            "timestamp": "2014-05-07T23: 20: 58-0400",
            "longitude": "-xx.xxxxxxx",
            "latitude": "xx.xxxxxxx",
            "verticalAccuracy": 10,
            "course": 0,
            "horizontalAccuracy": 65
        },
        "dwellStatus": 0,
        "weather": {
            "relativeHumidity": "68%",
            "visibilityKM": 16.1,
            "tempC": 13.3,
            "precipTodayIn": 0,
            "windKPH": 0,
            "latitude": 40.813984,
            "windDegrees": 159,
            "stationID": "xxxxxxxx",
            "visibilityMi": 10,
            "pressureIn": 30.2,
            "pressureMb": 1023,
            "feelslikeF": 55.9,
            "windGustKPH": 12.4,
            "longitude": -77.895775,
            "feelslikeC": 13.3,
            "precipTodayMetric": 0,
            "tempF": 55.9,
            "windDirection": "SSE",
            "dewpointC": 8,
            "uv": 0,
            "weather": "Overcast",
            "windGustMPH": 7.7,
            "windMPH": 0
        },
        "connection": 1,
        "sync": 0,
        "reportImpetus": 0,
        "draft": 0
    }
   ]
}
EOS

data = JSON.parse(json)

if data["snapshots"][-1]["responses"][2].nil?
 item = "was nil"
elsif # THIS WAS elseif before
 item = "NOT nil"
end

puts item