Ruby中嵌套对象转换成json的方法

   2015-10-22 0
核心提示:这篇文章主要介绍了Ruby中嵌套对象转换成json的方法,同时介绍了普通对象to_json的方法,需要的朋友可以参考下

JSON由于其数据结构简单便利,已逐渐成为了互联网上的主流数据交换的数据格式。

在讨论嵌套对象(Nested Object)的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
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • [ruby on rails] 跟我学之(6)显示指定数据
    根据《[ruby on rails] 跟我学之路由映射》,我们知道,可以访问 GET    /posts/:id(.:format) 来显示具体的对象。 修改 app/controllers/posts_controller.rb的show这个action。这里有个难题,如果获取url里面的参数?可以通过params内置变量进行访问
    03-16
  • [ruby on rails] 跟我学之(10)数据输入验证
    这里简单加上几个验证,非空,最小长度,唯一修改app/models/post.rb文件,如下:class PostActiveRecord::Base#attr_accessible :title, :contentvalidates :title, :context, :presence = truevalidates :title, :length = { :minimum =2}validates :title,
    03-16
  • 我尝试使用 Ruby 和 mittsu 库制作 3D 战斗动作游戏
    我尝试使用 Ruby 和 mittsu 库制作 3D 战斗动作
    概述这篇文章是关于我偶然发现的 hitbox 的回忆录。2022 夏季鲁比训练营创造了这个游戏。我的游戏仓库这里是。我们作为一个团队开发,有 4 名成员第一次见面,并第一次使用 Git 和 Github 进行开发。使用的技术是Ruby,三通图书馆是。我主要负责碰撞检测,所
    03-16
  • 我只是想在我的 Mac 上将 Ruby 和 Rails 更新到终端中的最新版本。 .
    我只是想在我的 Mac 上将 Ruby 和 Rails 更新到
    介绍自从我尝试创建一个简单的应用程序以来已经有很长时间了,并且我尝试在创建它之前将 Ruby 和 Rails 更新到最新版本,但是我意外卡住了,所以我将它作为备忘录留下。作为版本升级1. 更新 Homebrew 和 rbenv2. 红宝石更新3. Rails 更新这就是它的感觉。让我
    03-16
  • ruby写爬虫 ruby python
    ruby写爬虫 ruby python
    http://www.javaeye.com/topic/545160爬虫性能比较http://www.rubyrailways.com/data-extraction-for-web-20-screen-scraping-in-rubyrails/srcapihttp://huacnlee.com/blog/ruby-scrapi-collect-koubei  2009年4月22日 星期三用ruby写的一个网络爬虫程序前
    03-08
  • 一个关于创建一个可以用 Ruby 做 UMAP 的 gem 的故事
    一个关于创建一个可以用 Ruby 做 UMAP 的 gem
    介绍统一流形逼近和投影 (UMAP) 是一种通过降维的可视化方法,通常与 t-SNE 一起使用。用 Ruby 语言执行机器学习时,瘤胃我认为有很多情况下你使用 gem 调用。瘤胃有t-SNE但不是UMAP。这一次,它是一个 C++ 库乌马普的红宝石绑定我创造了它,所以我会在我忘记
    03-08
  • 让我们制作一个应用程序,当您在表格①中输入名称时输出 PDF 戳记(使用 Ruby on Rails 创建 PDF 文件)
    让我们制作一个应用程序,当您在表格①中输入名
    介绍你好!我的名字是荣查本。这次在Ruby on Rails中实现PDF转换的时候,用到了一个叫Prawn的gem,所以总结了一下。您可以通过阅读本文创建フォームに名前を入力するとPDF化された印鑑を出力するアプリ。即使是我,一个初学者也可以做到,所以实现方法很简单
    03-08
  • [脚本_Ruby]Windows安装配置Ruby On Rails
    感觉Java学的差不多了,想接触下Ruby On Rails,看看它比Java WEB高效到哪里了,在Ubuntu12.10上弄了两天总是报错提示没有指向的文件sqlite3,不管怎么安装sqlite3都不行,到最后没办法只有跑到WIN7平台下试试,以下就是我搭建Ruby On Rails的过程:    
    02-10
  • Prawn:Ruby生成PDF更简捷的选择
    在InfoQ上看到《Prawn:使用Ruby生成PDF更简捷》,其说到的Prawn可以更加快捷的在Ruby中生成PDF文件。因为之前使用过很多版本的PDF生成类库都不尽如人意,有的太复杂,有的太慢,于是对这个做了测试。1、安装安装很简单,直接使用gem install prawn即可安装完
    02-10
  • Ruby On Rails:InstanRails
    参考数据:对于Ruby On Rails 不是粉清楚的朋友可以参考以下的连结信息,该连结网站都提供不错的Ruby On Rails 信息。Ruby: 一个纯OO的脚本语言..Ruby on Rails: 快速建置Web的MVC架构的Framework说明:整合环境: Instant Rails 是在Windows环境中,整合了Ruby,
    02-10
点击排行