使用ruby处理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?

我有以下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?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
包含哈希的JSON
bar
包含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