2015-07-16 1 views
0

Я работаю с API, который принимает некоторые объекты JSON (отправляется как почтовый запрос) и не выполняет другие действия на основе определенных критериев.Как выбрать объекты из файла JSON и вставить новый файл, если они не соответствуют проверке API

Я пытаюсь скомпилировать «журнал» объектов, которые потерпели неудачу, и те, которые были успешно проверены, поэтому мне не нужно вручную копировать и вставлять их каждый раз. (Есть сотни объектов).

В принципе, если API возвращает «false», я хочу, чтобы этот объект был вложен в файл, и если он возвращает true, все эти объекты переходят в другой файл.

Я попытался прочитать кучу документации/блогов на «select, detect, reject» и т. Д. Перечислениях, но моя проблема сильно отличается от приведенных примеров.

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

restaurants = JSON.parse File.read('pretty-minified.json') 

restaurants.each do |restaurant| 
create_response = HTTParty.post("https://api.hailoapp.com/business/create", 
{ 
    :body => restaurant.to_json, 
    :headers => { "Content-Type" => "text", "Accept" => "application/x-www-form-urlencoded", "Authorization" => "token #{api_token}" } 
    }) 
    data = create_response.to_hash 
    alert = data["valid"] 
    if alert == false 
    # select restaurant json objects which return false and push into new file 
    # false_rest = restaurants.detect { |r| r == false } 
    File.open('false_objects.json', 'w') do |file| 
     file << JSON.pretty_generate(false_rest) 
    else 
    # select restaurant json objects which return true and push into another file 
    File.open('true_objects.json', 'w') do |file| 
     file << JSON.pretty_generate() 
    end 

end 

Пример вывода (JSON) из API выглядит следующим образом:

{"id":"102427","valid":true} 
{"valid":false} 

файл JSON в основном огромный массив хэшей (или объектов), вот короткая выдержка:

[ 
    { 
    "id": "223078", 
    "name": "3 South Place", 
    "phone": "+442032151270", 
    "email": "[email protected]", 
    "website": "", 
    "location": { 
     "latitude": 51.5190536, 
     "longitude": -0.0871038, 
     "address": { 
     "line1": "3 South Place", 
     "line2": "", 
     "line3": "", 
     "postcode": "EC2M 2AF", 
     "city": "London", 
     "country": "UK" 
     } 
    } 
    }, 
    { 
    "id": "210071", 
    "name": "5th View Bar & Food", 
    "phone": "+442077347869", 
    "email": "[email protected]", 
    "website": "http://www.5thview.com", 
    "location": { 
     "latitude": 51.5089594, 
     "longitude": -0.1359897, 
     "address": { 
     "line1": "Waterstone's Piccadilly", 
     "line2": "203-205 Piccadilly", 
     "line3": "", 
     "postcode": "W1J 9HA", 
     "city": "London", 
     "country": "UK" 
     } 
    } 
    }, 
    { 
    "id": "239971", 
    "name": "65 & King", 
    "phone": "+442072292233", 
    "email": "[email protected]", 
    "website": "http://www.65king.com/", 
    "location": { 
     "latitude": 51.5152533, 
     "longitude": -0.1916538, 
     "address": { 
     "line1": "65 Westbourne Grove", 
     "line2": "", 
     "line3": "", 
     "postcode": "W2 4UJ", 
     "city": "London", 
     "country": "UK" 
     } 
    } 
    } 
] 

ответ

1

Предполагая, что вы хотите фильтровать по электронной почте, заканчивая elior.com (это условие может быть легко изменено):

NB! Вышеуказанные данные выглядят как javascript var, это не действительный объект ruby. Я полагаю, вы только что получили его откуда-то в виде строки. Вот почему json:

require 'json' 
array = JSON.parse(restaurants) # data is a string: '[{....... as you received it 
result = array.group_by do |e| 
    # more sophisticated condition goes here 
    e['email'] =~ /elior\.com$/ ? true : false 
end 
File.open('false_objects.json', 'w') do |file| 
    file << JSON.pretty_generate(result[false]) 
end 
File.open('true_objects.json', 'w') do |file| 
    file << JSON.pretty_generate(result[true]) 
end 

Существует хэш в result, содержащий два элемента:

#⇒ { 
#  true: [..valids here ..], 
#  false: [..invalids here..] 
# } 
+0

Да, я знаю, что данные не рубин, но я разбора JSON и обработки списка объектов JSON как хэши в массиве. – daneasterman

+0

Затем 'JSON.parse' выведет из него массив, а следующий [' group_by'] (http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-group_by) будет разделите этот массив на две части по мере необходимости. – mudasobwa

+0

Спасибо @mudasobwa, это правильный синтаксис квадратной скобки? Могу ли я написать файл в нем, и он будет работать? – daneasterman