使用ruby处理json的困难
我有以下json使用ruby处理json的困难,ruby,json,Ruby,Json,我有以下json { "NumPages":"17", "Page":"1", "PageSize":"50", "Total":"808", "Start":"1", "End":"50", "FirstPageUri":"/v3/results?PAGE=1", "LastPageUri":"/v3/results?PAGE=17", "PreviousPageUri":"", "NextPageUri":"/v3/results?
{
"NumPages":"17",
"Page":"1",
"PageSize":"50",
"Total":"808",
"Start":"1",
"End":"50",
"FirstPageUri":"/v3/results?PAGE=1",
"LastPageUri":"/v3/results?PAGE=17",
"PreviousPageUri":"",
"NextPageUri":"/v3/results?PAGE=2",
"User":[
{
"RowNumber":"1",
"UserId":"86938",
"InternalId":"",
"CompletionPercentage":"100",
"DateTimeTaken":"2014-06-18T01:43:25Z",
"DateTimeLastUpdated":"2014-06-18T01:58:11Z",
"DateTimeCompleted":"2014-06-18T01:58:11Z",
"Account":{
"Id":"655",
"Name":"Technical Community College"
},
"FirstName":"Matthew",
"LastName":"Knice",
"EmailAddress":"knice@gmail.com",
"AssessmentResults":[
{
"Title":"Life Factors",
"Code":"LifeFactors",
"IsComplete":"1",
"AttemptNumber":"1",
"Percent":"58",
"Readiness":"fail",
"DateTimeCompleted":"2014-06-18T01:46:00Z"
},
{
"Title":"Learning Styles",
"Code":"LearnStyles",
"IsComplete":"0"
},
{
"Title":"Personal Attributes",
"Code":"PersonalAttributes",
"IsComplete":"1",
"AttemptNumber":"1",
"Percent":"52.08",
"Readiness":"fail",
"DateTimeCompleted":"2014-06-18T01:49:00Z"
},
{
"Title":"Technical Competency",
"Code":"TechComp",
"IsComplete":"1",
"AttemptNumber":"1",
"Percent":"100",
"Readiness":"pass",
"DateTimeCompleted":"2014-06-18T01:51:00Z"
},
{
"Title":"Technical Knowledge",
"Code":"TechKnowledge",
"IsComplete":"1",
"AttemptNumber":"1",
"Percent":"73.44",
"Readiness":"question",
"DateTimeCompleted":"2014-06-18T01:58:00Z"
},
{
"Title":"Reading Rate & Recall",
"Code":"Reading",
"IsComplete":"0"
},
{
"Title":"Typing Speed & Accuracy",
"Code":"Typing",
"IsComplete":"0"
}
]
},
{
"RowNumber":"2",
"UserId":"8654723",
"InternalId":"",
"CompletionPercentage":"100",
"DateTimeTaken":"2014-06-13T14:37:59Z",
"DateTimeLastUpdated":"2014-06-13T15:00:12Z",
"DateTimeCompleted":"2014-06-13T15:00:12Z",
"Account":{
"Id":"655",
"Name":"Technical Community College"
},
"FirstName":"Virginia",
"LastName":"Bustas",
"EmailAddress":"bigBusta@students.college.edu",
"AssessmentResults":[
{
...
我需要在你看到“User:”的地方开始处理我想忽略的开头的内容(numpages、page等)。这是我正在处理的处理脚本
require 'csv'
require 'json'
CSV.open("your_csv.csv", "w") do |csv| #open new file for write
JSON.parse(File.open("sample.json").read).each do |hash| #open json to parse
csv << hash.values
end
end
需要“csv”
需要“json”
打开(“您的| CSV.CSV”,“w”)执行| CSV |#打开新文件进行写入
parse(File.open(“sample.JSON”).read)。每个do | hash | open JSON进行解析
csv读取错误消息在散列上调用的每个
都将为您提供一个包含两个成员(键和值一起)的数组序列。数组上没有值
方法。在任何情况下,如果你拥有的是一个散列,那么用每一个循环它似乎没有什么意义;如果您想在散列中输入“User”
,为什么不提前请求它呢?您必须查看正在创建的JSON对象的结构。下面是正在解析的文档的一个非常小的子集,它使您更容易查看和理解:
require 'json'
foo = '{"NumPages":17,"User":[{"UserId":12345}]}'
bar = JSON[foo]
# => {"NumPages"=>17, "User"=>[{"UserId"=>12345}]}
bar['User'].first['UserId'] # => 12345
foo
包含哈希的JSONbar
包含JSON解析器在读取foo
后创建的Ruby对象
User
是指向哈希数组的键。因为它是一个数组,所以必须指定数组中要查看的哈希值,这就是bar['User']所做的
访问该子散列的另一种方法是:
bar['User'][0]['UserId'] # => 12345
如果数组中有多个哈希,可以使用适当的索引值访问它们。例如,如果有两个哈希,我想要第二个:
foo = '{"NumPages":17,"User":[{"UserId":12345},{"UserId":12346}]}'
bar = JSON[foo]
# => {"NumPages"=>17, "User"=>[{"UserId"=>12345}, {"UserId"=>12346}]}
bar['User'].first['UserId'] # => 12345
bar['User'][0]['UserId'] # => 12345
bar['User'][1]['UserId'] # => 12346
我想知道我是否在使用JSON.parse(File.open(“sample.JSON”).read)时走错了路
是的,你是。您需要了解自己在做什么,并将代码分解为可消化的部分,以便它们对您有意义。考虑这一点:
require 'csv'
require 'json'
json_object = JSON.parse(File.read("sample.json"))
CSV.open("your_csv.csv", "w") do |csv| #open new file for write
csv << %w[RowNumber UserID AccountID AccountName FirstName LastName EmailAddress]
json_object['User'].each do |user_hash|
puts 'RowNumber: %s' % user_hash['RowNumber']
puts 'UserID: %s' % user_hash['UserID']
account = user_hash['UserID']['Account']
puts 'Account->Id: %s' % account['Id']
puts 'Account->Name: %s' % account['Name']
puts 'FirstName: %s' % user_hash['FirstName']
puts 'LastName: %s' % user_hash['LastName']
puts 'EmailAddress: %s' % user_hash['EmailAddress']
csv << [
user_hash['RowNumber'],
user_hash['UserID'],
account['Id'],
account['Name'],
user_hash['FirstName'],
user_hash['LastName'],
user_hash['EmailAddress']
]
end
end
需要“csv”
需要“json”
json_object=json.parse(File.read(“sample.json”))
打开(“您的| CSV.CSV”,“w”)执行| CSV |#打开新文件进行写入
csv仅针对后代和上下文,这是我最终在其实体中使用的脚本。我需要从一个url中提取,处理结果并将其移动到一个简单的CSV。我需要将学生id、名字、姓氏和4次评估中的每一次的分数输入csv
require 'csv'
require 'json'
require 'curb'
c = Curl::Easy.new('myURL/m/v3/results')
c.http_auth_types = :basic
c.username = 'myusername'
c.password = 'mypassword'
c.perform
json_object = JSON.parse(c.body_str)
CSV.open("your_csv.csv", "w") do |csv| #open new file for write
csv << %w[UserID FirstName LastName LifeFactors PersonalAttributes TechComp TechKnowledge]
json_object['User'].each do |user_hash|
csv << [
user_hash['UserId'],
user_hash['FirstName'],
user_hash['LastName'],
user_hash['AssessmentResults'][0]['Percent'],
user_hash['AssessmentResults'][2]['Percent'],
user_hash['AssessmentResults'][3]['Percent'],
user_hash['AssessmentResults'][4]['Percent']
]
end
end
需要“csv”
需要“json”
需要“路缘”
c=Curl::Easy.new('myURL/m/v3/results')
c、 http_auth_types=:基本
c、 用户名='myusername'
c、 密码='mypassword'
c、 表演
json\u object=json.parse(c.body\u str)
打开(“您的| CSV.CSV”,“w”)执行| CSV |#打开新文件进行写入
csv“什么是只处理“用户”数据的最佳方式?”好吧,在JSON中循环处理所有内容肯定不是最好的方式。如果您只需要“用户”数据,请从提取“用户”数据开始(例如,myJson[“用户”]
)。不要提供JSON的片段。去掉所有不必要的东西,但是JSON必须保持有效,否则你会让我们更难帮助你。是的,@theTinMan提出了一个重要的观点。“用户”条目值显然是一个至少一个哈希的数组,但是信息在中间被截断,所以我们无法准确地描述如何访问它。这里是一个扩展版本的数据,所以……这是我的问题。我不知道如何只要求“用户”数据?我尝试了hash.values[“User”],但没有雪茄。但是您是否尝试了hash=JSON.parse(File.open(“sample.JSON”).read;p hash[“User”]
?在我看来,你似乎不是很系统;你只是疯狂地猜测,一次尝试几件事情,而不是思考和分解问题。感谢你的详细帖子。我在将你发布的内容应用到JSON.parse方法时遇到了问题。我想知道我是否在使用JSON.parse时走错了路(File.open(“sample.json”).read)。每个do | hash |?感谢您添加更多信息罐。这让我达到了我需要的位置!
require 'csv'
require 'json'
require 'curb'
c = Curl::Easy.new('myURL/m/v3/results')
c.http_auth_types = :basic
c.username = 'myusername'
c.password = 'mypassword'
c.perform
json_object = JSON.parse(c.body_str)
CSV.open("your_csv.csv", "w") do |csv| #open new file for write
csv << %w[UserID FirstName LastName LifeFactors PersonalAttributes TechComp TechKnowledge]
json_object['User'].each do |user_hash|
csv << [
user_hash['UserId'],
user_hash['FirstName'],
user_hash['LastName'],
user_hash['AssessmentResults'][0]['Percent'],
user_hash['AssessmentResults'][2]['Percent'],
user_hash['AssessmentResults'][3]['Percent'],
user_hash['AssessmentResults'][4]['Percent']
]
end
end