如何使用ruby从JSON响应中提取所有URL? 我有一个返回JSON的URL(test.testurl.de/test?p=12),例如
...
images: [
{
path: "http://static.mydomain.de/pics/z.jpg",
format: "image/jpeg",
},
{
path: "http://static.mydomain.de/pics/y.jpg",
format: "image/jpeg",
},
{
path: "http://static.mydomain.de/pics/x.jpg",
format: "image/jpeg",
},
...
如果我尝试通过提取:
test = open("test.testurl.de/test?p=12").read
puts URI.extract(test)
然后我得到:
["http:", "http:", "http:"]
有人可以告诉我为什么我不会获得整个网址吗?
THX
答案 0 :(得分:0)
我建议使用HTTP客户端,例如HTTParty,Typhoeus,或者更好的法拉第。
但是,如果你想自己动手使用JSON gem来解析响应,例如:
response = open("test.testurl.de/test?p=12").read
parsed = JSON.parse(response) rescue {}
parsed['images'].map { |image| image['path'] }
答案 1 :(得分:0)
images: [
{
path: "http://static.mydomain.de/pics/z.jpg",
format: "image/jpeg",
},
...
...
你的字符串不是json,所以你不能把它解析为json。那真的是什么回来了?
如果我尝试通过提取:
test = open("test.testurl.de/test?p=12").read puts URI.extract(test)
然后我得到:
["http:", "http:", "http:"]
我得到了不同的东西:
require 'uri'
str =<<END_OF_JUNK
images: [
{
path: "http://static.mydomain.de/pics/z.jpg",
format: "image/jpeg",
},
{
path: "http://static.mydomain.de/pics/y.jpg",
format: "image/jpeg",
},
{
path: "http://static.mydomain.de/pics/x.jpg",
format: "image/jpeg",
}
]
END_OF_JUNK
p URI.extract(str)
--output:--
["path:", "http://static.mydomain.de/pics/z.jpg", "format:", "path:", "http://static.mydomain.de/pics/y.jpg", "format:", "path:", "http://static.mydomain.de/pics/x.jpg", "format:"]
有了这个输出,我可以这样做:
results = results.select do |url|
url.start_with? "http"
end
p results
--output:--
["http://static.mydomain.de/pics/z.jpg", "http://static.mydomain.de/pics/y.jpg", "http://static.mydomain.de/pics/x.jpg"]
但是,如果您发布的内容是,例如,将转换为json的ruby散列的一部分:
require 'json'
require 'uri'
hash = {
images: [
{
path: "http://static.mydomain.de/pics/z.jpg",
format: "image/jpeg",
},
{
path: "http://static.mydomain.de/pics/y.jpg",
format: "image/jpeg",
},
{
path: "http://static.mydomain.de/pics/x.jpg",
format: "image/jpeg",
}
]
}
str = JSON.dump(hash)
p str
--output:--
"{\"images\":[{\"path\":\"http://static.mydomain.de/pics/z.jpg\",\"format\":\"image/jpeg\"},{\"path\":\"http://static.mydomain.de/pics/y.jpg\",\"format\":\"image/jpeg\"},{\"path\":\"http://static.mydomain.de/pics/x.jpg\",\"format\":\"image/jpeg\"}]}"
然后你可以这样做:
results = URI.extract(str)
p results
--output:--
["http://static.mydomain.de/pics/z.jpg", "http://static.mydomain.de/pics/y.jpg", "http://static.mydomain.de/pics/x.jpg"]