三流プログラマの雑記

プログラム、ゲーム、株、その他雑記など書いてます。

Ruby + JSON

Ruby 1.9 からはJSONがデフォルトサポートされているらしい、、、

ということで、
前使用したJSONデータを読み込んでみた。

sample.json

[{
    "title": "tete",
    "price": "1280",
    "pages": [
        { "page": "1", "g": 22 },
        { "page": "2", "g": 33 },
        { "page": "3", "g": 11 }
    ]
},
{
    "title": "2",
    "price": "1235",
    "pages": [
        { "page": "4", "g": 66 },
        { "page": "5", "g": 55 },
        { "page": "6", "g": 44 }
    ]
}]

test.rb
どうにも Parse だとJSONの配列形式うまく取り込めないのかな?
かなり無理やり感があるけど、とりあえず動くレベルのソース
なんというか汚いソースだ。良い方法ないかな?

# -*- encoding: UTF-8 -*-

require 'json'
require './book'
require './page'

books = Array.new
# JSONファイル読み込み
# ファイルオープン
open("sample.json","r:UTF-8") do |io|
  #print io.read
  # JSON Load
  json = JSON.parse(io.read)
  #print json
  b1,b2,b3=false
  json.each do |k|
  book = Book.new
    k.each do |l,n|
      if l == "title" then
        book.setTitle(n)
        print "title:#{book.getTitle}\n"
        b1 = true
      elsif l == "price" then
        book.setPrice(n)
        print "price:#{book.getPrice}\n"
        b2 = true
      elsif l == "pages"
        pages = Page.new
        p1,p2 = false
        n.each do |o|
          o.each do |p,q|
            if p == "page" then
              print "page:#{q}\n"
              pages.setPage(q)
              p1=true
            elsif p == "g" then
              print "g:#{q}\n"
              pages.setG(q)
              p2=true
            end
            if p1 && p2 then
              print "print\n"
              book.setPage(pages)
              p1,p2 = false
              pages = Page.new
            end
          end
        end
        b3 =true
      end
      if b1 && b2 && b3 then
        books << book
        b1,b2,b3=false
      end
    end
  end
  print books
end

一応取得したデータは beanもどきを作って格納 addPageは不要だな(書いたけど実装めんどくさいから放置)

book.rb

# -*- encoding: UTF-8 -*-
require './page'

class Book
  def initialize
    @title=""
    @price=0
    @page=Array.new
  end
  def setTitle(title)
    @title = title
  end
  def setPrice(price)
    @price = price
  end
  def setPage(page)
    @page << page
  end
  def addPage(page,g)
    tmpPage = Page.new(page,g) 
    setPage(tmpPage)
  end
  def getTitle
    return @title
  end
  def getPrice
    return @price
  end
  def getPage
    return @Page
  end
end

page.rb

# -*- encoding: UTF-8 -*-

class Page
  def initialize(page="",g=0)
    @page=page
    @g=g
  end
  def setPage(page)
    @page = page
  end
  def setG(g)
    @g = g
  end
  def getPage
    return @page
  end
  def getG
    return @g
  end
end

まーprintの結果は以下のような感じに。
これさえ出来りゃちょっとだけよーってな感じでデータ取れるかな。

[#<Book:0x2b4d180 @title="tete", @price="1280", @page=[#<Page:0x2b4ca78 @page="1", @g=22>, #<Page:0x2b4c7c0 @page="2", @g=33>, #<Page:0x2b4c580 @page="3", @g=11>]>, #<Book:0x2b4c2e0 @title="2", @price="1235", @page=[#<Page:0x2b4bc08 @page="4", @g=66>, #<Page:0x2b4b998 @page="5", @g=55>, #<Page:0x2b4b770 @page="6", @g=44>]>]