Rails Rails 中怎么把字符串转化成 JSON Array

wl1991724 · 2015年06月01日 · 最后由 wl1991724 回复于 2015年06月02日 · 6914 次阅读

["AA_AA","AA_AA","AA_AA","AA_AA","AA_AA","AA_AA","AA_AA","AA_AA","AA_AA","AA_AA","AA_AA","AAAAA"] 这种字符串,在 java 中我是用 google 的 Gson 转化的, new Gson.toJson(string,new ArrayList()),然后得到一个 list,返回 json 的时候就自动转换为 json 数组了,在 rails 中有类似的方法吗?

array.to_json
respond_to do |format|
  format.json { render json: array }
end

@rei 这是一个 model 里的一个字段,我直接 render json:models 得到的是字符串,要遍历一下吗?该怎么写呢

#2 楼 @wl1991724 json 就是字符串啊。

“[\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\"]”rails 返回的值是这样的 是一个字符串,我想要的是这样的 ["AA_AA","AA_AA","AA_AA","AA_AA","AA_AA","AA_AA","AA_AA","AA_AA","AA_AA","AA_AA","AA_AA","AAAAA"] 是一个数组

如果在终端输出,因为 json 是个字符串,所以两边就会加上引号。如果在浏览器输出,两边就没有引号,因为不需要。

@rei 我在 firebug 中调试的,发现加上引号了,变成了一个字符串

#6 楼 @wl1991724 是不是写了两重 to_json 了?render json: 就会自动调用 to_json。你用虚构的代码我看不出问题,正常 render json: models 就是输出 json。

真实例子:

https://github.com/rubygems/rubygems.org/blob/c3c9c7d1843a22dce9a934e669d0924f6d2246f5/app/controllers/api/v1/searches_controller.rb#L8

#6 楼 @wl1991724 另外,firebug 也是终端,字符串也要加引号。你用 javascript 的 json 解析器解析看看。

> JSON.parse("[\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\"]")
["AA_AA", "AA_AA", "AA_AA", "AA_AA", "AA_AA", "AA_AA", "AA_AA", "AA_AA", "AA_AA", "AA_AA"]

@rei 我用 JSON.parse 是能转化为 jsonArray 的,只是在 java 中定义个 getList 方法,会从 string 转成 list,然后 render json 的时候 list 会自动转成 jsonArray,不需要再用 JSON.parse 了,我以为 rails 也会有这种方法呢,看来还是不一样呀,还有能给我推荐下 rails 的教程嘛,我把 rails guides 看完了,发现有不少地方讲的不详细,比如 active Record 的事务,rails 的统一异常处理,format.json|html|yaml 这些东西都找不到啊

#9 楼 @wl1991724 jsonArray 是个 Java 内存中的对象,最终输出的时候是转化为字符串的。你觉得不需要 JSON.parse 是因为 ajax 库已经把这件事做了。

你在 Ruby 终端试试:

puts "[\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\",\"AA_AA\"]"

是不是要的 JSON?

@rei 嗯,是这样的

我觉得楼主主要纠结的地方是,这是字符串的终端表示(irb,浏览器 console):

"string"

这是字符串的纯文本表示(API 输出):

string

这两个是一样的。

@rei 请问在 rails 中,怎么把 json 转成数组呢

@rei 非常感谢,再麻烦您一下,我用 rails render json 返回的日期类型是 2015-05-15T09:38:55.000Z 这样的,我想返回 yyyy—MM-dd HH:mm:ss 怎么做呢?

#15 楼 @wl1991724

方法一:覆盖 Model 的 as_json 方法

http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html

def as_json
  super.merge(
    created_at: created_at.strftime( FORMAT_STRING ) # http://ruby-doc.org/core-2.2.0/Time.html#method-i-strftime
  )
end

方法二:用 https://github.com/rails/jbuilder 逐个字段定制。

@rei 谢谢您,我试了一下,是可以的,但是我这样我需要 model 里都重写一个 as_json 方法,然后调用 model.as_json,这样写是不是有点违背 DRY 了啊,怎么组织代码呢,在 active record::Base 里写吗?

#17 楼 @wl1991724 要一次更改全局可以覆盖 ActiveSupport::TimeWithZone,但你要确定会不会破坏其它地方。

2015-05-15T09:38:55.000Z 就是 JavaScript 能解析的 ISO-8601 标准格式,如果不想违背 DRY,是不是不应该修改这个格式呢? https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

@rei rails 中时区怎么设置呢,我 3 点存入的数据库,但是 create_at 显示是 7 点呢

#19 楼 @wl1991724

application.rb 里

config.time_zone = 'Beijing'

这是告诉 Rails 用哪个时区来显示数据库时间,但是,查找的时候,显示的是 utc 时间,也就是数据库保存的时间,当我们调用属性的时候,会转成刚才设置的时区时间。

2.2.2 :032 > Product.first
 => #<Product id: 1, name: "Hat", price: #<BigDecimal:7f8e7c971208,'0.999E1',18(36)>, description: nil, created_at: "2015-06-02 06:10:54", updated_at: "2015-06-02 06:58:59"> 
2.2.2 :033 > Product.first.created_at
 => Tue, 02 Jun 2015 14:10:54 CST +08:00 
需要 登录 后方可回复, 如果你还没有账号请 注册新账号