麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Ruby > 正文

Ruby中嵌套對象轉換成json的方法

2020-02-24 15:38:03
字體:
來源:轉載
供稿:網友

JSON由于其簡單方便的數據結構,逐漸成為互聯網上的主流數據交換格式,今天武林技術頻道小編帶大家學習之前,先帶大家來學習Ruby中嵌套對象轉換成json的方法。
首先,ruby對象轉換為JSON字符串:

?

復制代碼 代碼如下:

class Obj1

?

??? def initialize(var1)

??????? @var1 = var1

??? end


??? def to_json(*a)

??????? {

??????????? "json_class" => self.class,

??????????? "data" => {"var1" => @var1}

??????? }.to_json(*a)

??? end


??? def self.json_create(json_str)

??????? new(json_str["data"]["var1"])

??? end

end


obj1 = Obj1.new("i am obj1")


#obj1 to JSON string

json_str = obj1.to_json

puts "JSON string of obj1 = #{json_str}"


#JSON string to obj1

obj11 = JSON.parse(json_str)

puts "ob1 from json string = #{obj11.var1}"

?


上面代碼我們可以看到,ruby與JSON string之間的轉換,關鍵有三個點:

#引入json庫,才能有下面兩個方法,json是通過open class的方式,給Hash對象加上了to_json(*a)方法,關于ruby的open class參考支持Open Class特性的編程語言中的開閉原則(Open-Closed Principle)
1)require ‘json'

#定義對象轉為JSON string的to_json(*a)方法,其實現是使用Hash對象的to_json(*a)方法
2)def to_json(*a)

#定義從JSON string構造對象的json_create方法,此方法是類方法
3)def self.json_create(json_str)

上面三點是Ruby中實現JSON string互相轉換的基本要求。

代碼運行結果為:

?

復制代碼 代碼如下:

JSON string of obj1 = {"json_class":"Obj1","data":{"var1":"i am obj1"}}

?

ob1 from json string = i am obj1

?


現在我們來看嵌套對象的JSON string轉換:

?

復制代碼 代碼如下:

#!/usr/local/ruby/bin/ruby

?


require 'json'


class Obj1

??? def initialize(var1)

??????? @var1 = var1

??? end


??? def to_json(*a)

??????? {

??????????? "json_class" => self.class,

??????????? "data" => {"var1" => @var1}

??????? }.to_json(*a)

??? end


??? def self.json_create(json_str)

??????? new(json_str["data"]["var1"])

??? end


??? attr_reader :var1

end


class Obj2

??? def initialize(var2)

??????? @var2 = var2

??? end


??? def to_json(*a)

??????? {

??????????? "json_class" => self.class,

??????????? "data" => {"var2" => @var2}

??????? }.to_json(*a)

??? end


??? def self.json_create(json_str)

??????? new(json_str["data"]["var2"])

??? end


??? attr_reader :var2

end


class Obj

??? def initialize(obj1, obj2)

??????? @obj1 = obj1

??????? @obj2 = obj2

??? end


??? def to_json(*a)

??????? {

??????????? "json_class" => self.class,

??????????? "data" => {"obj1" => @obj1.to_json, "obj2" => @obj2.to_json}

??????? }.to_json(*a)

??? end


??? def self.json_create(json_str)

??????? new(json_str["data"]["obj1"], json_str["data"]["obj2"])

??? end


??? def to_s

??????? "Hi, i am obj"

??? end


??? attr_reader :obj1, :obj2

end


obj1 = Obj1.new("i am obj1")

obj2 = Obj2.new("i am obj2")

obj = Obj.new(obj1,obj2)


obj_json_str = obj.to_json

puts "JSON string of obj = #{obj_json_str}"


obj_1 = JSON.parse(obj_json_str)

puts "obj_1 from json string , obj1.class = #{obj_1.obj1.class}, obj2.class = #{obj_1.obj2.class}"

?


上面代碼中,嵌套對象我們慣性思維,是先將對象自己轉換為JSON string:

?

復制代碼 代碼如下:

"data" => {"obj1" => @obj1.to_json, "obj2" => @obj2.to_json}

?

上面代碼輸出:

?

復制代碼 代碼如下:

JSON string of obj = {"json_class":"Obj","data":{"obj1":"{/"json_class/":/"Obj1/",/"data/":{/"var1/":/"i am obj1/"}}","obj2":"{/"json_class/":/"Obj2/",/"data/":{/"var2/":/"i am obj2/"}}"}}

?

obj_1 from json string , obj1.class = String, obj2.class = String

?

我們注意到,被嵌套的對象轉換為JSON string后,多了一個反斜杠 / :

?

復制代碼 代碼如下:

JSON string of obj = {"json_class":"Obj","data":{"obj1":"{/"json_class/":/"Obj1/",/"data/":{/"var1/":/"i am obj1/"}}","obj2":"{/"json_class/":/"Obj2/",/"data/":{/"var2/":/"i am obj2/"}}"}}

?

且,JSON string轉換后,obj對象中嵌套的對象obj1和obj2,其類型都為String,而不是期望的Obj1和Obj2類型

?

復制代碼 代碼如下:

obj_1 from json string , obj1.class = String, obj2.class = String

?

實際上,這里是慣性思維害人,被嵌套的對象,不需要調用其to_json方法。
因此將Obj類的to_json代碼:

?

復制代碼 代碼如下:

??? def to_json(*a)

?

??????? {

??????????? "json_class" => self.class,

??????????? "data" => {"obj1" => @obj1.to_json, "obj2" => @obj2.to_json}

??????? }.to_json(*a)

??? end

?

修正為:

?

復制代碼 代碼如下:

??? def to_json(*a)

?

??????? {

??????????? "json_class" => self.class,

??????????? "data" => {"obj1" => @obj1, "obj2" => @obj2}

??????? }.to_json(*a)

??? end

?

然后,運行代碼,可以看到預期的輸出:

?

復制代碼 代碼如下:

JSON string of obj = {"json_class":"Obj","data":{"obj1":{"json_class":"Obj1","data":{"var1":"i am obj1"}},"obj2":{"json_class":"Obj2","data":{"var2":"i am obj2"}}}}

?

obj_1 from json string = {"json_class"=>"Obj", "data"=>{"obj1"=>#, "obj2"=>#}}

通過上面的介紹,想必大家對于Ruby中嵌套對象轉換成json的方法已經有了足夠的了解了,希望大家多多支持武林技術頻道!

?

?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 国内成人自拍视频 | 一区二区久久精品66国产精品 | 在线视频 日韩 | 国产精品视频一区二区三区四 | 激情网站免费观看 | 失禁高潮抽搐喷水h | 亚洲最大久久 | 九九热九九 | 久久小视频 | 久久手机在线视频 | 亚洲精品久久久久久久久久久 | 欧美一级黄 | 黄色影院在线看 | 欧美成人鲁丝片在线观看 | 午夜精品福利视频 | 欧美一区二区三区不卡免费观看 | 中文字幕一区久久 | 中文字幕精品在线视频 | 最新在线中文字幕 | 美女性感毛片 | 在线成人精品视频 | 日韩精品一区二 | 伦一区二区三区中文字幕v亚洲 | 一级一级一级毛片 | chinese hd xxxx tube | 史上最强炼体老祖动漫在线观看 | qyl在线视频精品免费观看 | 深夜视频福利 | 丁香天堂网 | 欧美中文在线 | 最新一区二区三区 | 欧美乱码精品一区 | 密室逃脱第一季免费观看完整在线 | 国产在线精品91 | 极品五月天 | 一级做a爱片性色毛片 | 91久久国产综合久久91精品网站 | 精品一区二区免费 | 欧美性生活久久久 | 久久精热 | 1314成人网 |