美文网首页关于搜索,我们聊聊
Active Model JSON Serializer

Active Model JSON Serializer

作者: 朱小虎XiaohuZhu | 来源:发表于2014-09-16 10:09 被阅读145次

    Neil Zhu,简书ID Not_GOD,University AI 创始人 & Chief Scientist,致力于推进世界人工智能化进程。制定并实施 UAI 中长期增长战略和目标,带领团队快速成长为人工智能领域最专业的力量。
    作为行业领导者,他和UAI一起在2014年创建了TASA(中国最早的人工智能社团), DL Center(深度学习知识中心全球价值网络),AI growth(行业智库培训)等,为中国的人工智能人才建设输送了大量的血液和养分。此外,他还参与或者举办过各类国际性的人工智能峰会和活动,产生了巨大的影响力,书写了60万字的人工智能精品技术内容,生产翻译了全球第一本深度学习入门书《神经网络与深度学习》,生产的内容被大量的专业垂直公众号和媒体转载与连载。曾经受邀为国内顶尖大学制定人工智能学习规划和教授人工智能前沿课程,均受学生和老师好评。

    原地址

    Active Model JSON Serializer

    methods

    • A as_json
    • F from_json

    Included Modules

    • ActiveModel::Serialization

    Instance Public methods

    as_json(options = nil)

    返回表示這個模型的hash。部分配置可以通过options传递。

    option include_root_in_json控制了as_json的顶层行为。如果設置為trueas_json將忽略掉該對象類型的根節點。include_root_in_json选項的默认值是false

    user = User.find(1)
    user.as_json
    # => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
    #     "created_at" => "2006/08/01", "awesome" => true}
    
    ActiveRecord::Base.include_root_in_json = true
    
    user.as_json
    # => { "user" => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
    #                  "created_at" => "2006/08/01", "awesome" => true } }
    

    這個效果同样可以通过设置root选项为true达到:

    user = User.find(1)
    user.as_json(root: true)
    # => { "user" => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
    #                  "created_at" => "2006/08/01", "awesome" => true } }
    

    若是没有任何的选项,则返回的Hash将会包含这个模型的所有属性:

    user.as_json(only: [:id, :name])
    # => { "id" => 1, "name" => "Konata Izumi" }
    
    user.as_json(except: [:id, :created_at, :age])
    # => { "name" => "Konata Izumi", "awesome" => true }
    

    包含对模型的某些方法的调用的结果使用methods

    user.as_json(methods: :permalink)
    # => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
    #      "created_at" => "2006/08/01", "awesome" => true,
    #      "permalink" => "1-konata-izumi" }
    

    包含关联则可以使用include

    user.as_json(include: :posts)
    # => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
    #      "created_at" => "2006/08/01", "awesome" => true,
    #      "posts" => [ { "id" => 1, "author_id" => 1, "title" => "Welcome to the weblog" },
    #                   { "id" => 2, "author_id" => 1, "title" => "So I was thinking" } ] }
    

    第二层和更高层的关联同样可以使用:

    user.as_json(include: { posts: {
                               include: { comments: {
                                              only: :body } },
                               only: :title } })
    # => { "id" => 1, "name" => "Konata Izumi", "age" => 16,
    #      "created_at" => "2006/08/01", "awesome" => true,
    #      "posts" => [ { "comments" => [ { "body" => "1st post!" }, { "body" => "Second!" } ],
    #                     "title" => "Welcome to the weblog" },
    #                   { "comments" => [ { "body" => "Don't think too hard" } ],
    #                     "title" => "So I was thinking" } ] }
    

    from_json(json, include_root=include_root_in_json)

    使用一个JSON字符串来设置模型属性。返回self

    class Person
      include ActiveModel::Serializers::JSON
    
      attr_accessor :name, :age, :awesome
    
      def attributes=(hash)
        hash.each do |key, value|
          send("#{key}=", value)
        end
      end
    
      def attributes
        instance_values
      end
    end
    json = { name: 'bob', age: 22, awesome:true }.to_json
    person = Person.new
    person.from_json(json) # => #<Person:0x007fec5e7a0088 @age=22, @awesome=true, @name="bob">
    person.name            # => "bob"
    person.age             # => 22
    person.awesome         # => true
    

    include_root默认值为false。如果给定的JSON串包含了单一的根节点,那你可以改设为false

    json = { person: { name: 'bob', age: 22, awesome: true } }.to_json
    person = Person.new
    person.from_json(json)
    person.name
    person.age
    person.awesome
    

    相关文章

      网友评论

        本文标题:Active Model JSON Serializer

        本文链接:https://www.haomeiwen.com/subject/mkqutttx.html