首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ruby对象和JSON序列化(没有Rails)

Ruby对象和JSON序列化(没有Rails)
EN

Stack Overflow用户
提问于 2010-12-17 02:19:18
回答 11查看 106.8K关注 0票数 70

我正在尝试理解Ruby中的JSON序列化环境。我是新来Ruby的。

如果您不使用Rails,有没有什么好的JSON序列化选项?

这似乎就是这个问题的答案(对于Rails) How to convert a Ruby object to JSON

json gem似乎让它看起来像是您必须编写自己的to_json方法。我还没能让to_json处理数组和散列(文档说它能处理这些),是不是json gem不能只反射对象并使用默认的序列化策略呢?这不就是to_yaml的工作方式吗(在这里猜测)

EN

回答 11

Stack Overflow用户

发布于 2010-12-17 03:42:52

为了使JSON库可用,您可能需要从包管理器安装libjson-ruby

要使用'json‘库:

require 'json'

要将对象转换为JSON (这3种方法是等效的):

JSON.dump object #returns a JSON string
JSON.generate object #returns a JSON string
object.to_json #returns a JSON string

将JSON文本转换为对象(这两种方法等效):

JSON.load string #returns an object
JSON.parse string #returns an object

对于来自您自己的类的对象来说,这会有点困难。对于下面的类,to_json将生成类似于"\"#<A:0xb76e5728>\""的内容。

class A
    def initialize a=[1,2,3], b='hello'
        @a = a
        @b = b
    end
end

这可能是不可取的。要有效地将对象序列化为JSON,您应该创建自己的to_json方法。为此,from_json类方法将非常有用。你可以像这样扩展你的类:

class A
    def to_json
        {'a' => @a, 'b' => @b}.to_json
    end
    def self.from_json string
        data = JSON.load string
        self.new data['a'], data['b']
    end
end

你可以通过继承一个'JSONable‘类来实现自动化:

class JSONable
    def to_json
        hash = {}
        self.instance_variables.each do |var|
            hash[var] = self.instance_variable_get var
        end
        hash.to_json
    end
    def from_json! string
        JSON.load(string).each do |var, val|
            self.instance_variable_set var, val
        end
    end
end

然后,可以使用object.to_json序列化到JSON,并使用object.from_json! string将保存为JSON字符串的保存状态复制到对象。

票数 111
EN

Stack Overflow用户

发布于 2013-06-19 11:10:58

查看Oj。当涉及到将任何旧对象转换为JSON时,有一些陷阱,但Oj可以做到这一点。

require 'oj'

class A
    def initialize a=[1,2,3], b='hello'
        @a = a
        @b = b
    end
end

a = A.new
puts Oj::dump a, :indent => 2

这将输出以下内容:

{
  "^o":"A",
  "a":[
    1,
    2,
    3
  ],
 "b":"hello"
}

请注意,^o用于指定对象的类,并且用于帮助反序列化。要省略^o,请使用:compat模式:

puts Oj::dump a, :indent => 2, :mode => :compat

输出:

{
  "a":[
    1,
    2,
    3
  ],
  "b":"hello"
}
票数 11
EN

Stack Overflow用户

发布于 2010-12-17 03:30:54

如果渲染性能很重要,您可能还想看看yajl-ruby,它是一个到C yajl库的绑定。该序列化API如下所示:

require 'yajl'
Yajl::Encoder.encode({"foo" => "bar"}) #=> "{\"foo\":\"bar\"}"
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4464050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档