2017-04-15 105 views
0

我正在尝试创建一个接受输入的函数。在这种情况下是跟踪代码。查看JSON文件中的跟踪代码,然后将跟踪代码作为输出返回。 JSON文件如下:在ruby中比较输入到json文件中的字段

[ 
    { 
    "tracking_number": "IN175417577", 
    "status": "IN_TRANSIT", 
    "address": "237 Pentonville Road, N1 9NG" 
    }, 
    { 
    "tracking_number": "IN175417578", 
    "status": "NOT_DISPATCHED", 
    "address": "Holly House, Dale Road, Coalbrookdale, TF8 7DT" 
    }, 
    { 
    "tracking_number": "IN175417579", 
    "status": "DELIVERED", 
    "address": "Number 10 Downing Street, London, SW1A 2AA" 
    } 
] 

我一直在使用此功能并开始:

def compare_content(tracking_number) 
    File.open("pages/tracking_number.json", "r") do |file| 
    file.print() 
end 

不知道我怎么会输入比较JSON文件。任何帮助将非常感激。

回答

1

您可以use the built-in JSON module

require 'json' 

def compare_content(tracking_number) 
    # Loads ENTIRE file into string. Will not be effective on very large files 
    json_string = File.read("pages/tracking_number.json") 

    # Uses the JSON module to create an array from the JSON string 
    array_from_json = JSON.parse(json_string) 

    # Iterates through the array of hashes 
    array_from_json.each do |tracking_hash| 
    if tracking_number == tracking_hash["tracking_number"] 
     # If this code runs, tracking_hash has the data for the number you are looking up 
    end 
    end 
end 

这将解析JSON供给哈希然后你就可以比较你正在寻找了号的数组。

如果您是生成JSON文件的人,并且此方法将被调用很多,请考虑将跟踪编号直接映射到其数据,以便此方法运行得更快。例如,

{ 
    "IN175417577": { 
    "status": "IN_TRANSIT", 
    "address": "237 Pentonville Road, N1 9NG" 
    }, 
    "IN175417578": { 
    "status": "NOT_DISPATCHED", 
    "address": "Holly House, Dale Road, Coalbrookdale, TF8 7DT" 
    }, 
    "IN175417579": { 
    "status": "DELIVERED", 
    "address": "Number 10 Downing Street, London, SW1A 2AA" 
    } 
} 

这将解析到一个哈希,在那里你可以更轻松地获取数据:

require 'json' 

def compare_content(tracking_number) 
    json_string = File.read("pages/tracking_number.json") 

    hash_from_json = JSON.parse(json_string) 

    if hash_from_json.key?(tracking_number) 
    tracking_hash = hash_from_json[tracking_number] 
    else 
    # Tracking number does not exist 
    end 
end 
+0

干杯安德鲁感谢。 – AltBrian