programing

json 출력에 가상 특성 추가

telecom 2023. 3. 21. 21:31
반응형

json 출력에 가상 특성 추가

TODO 목록을 처리하는 앱이 있다고 가정해 보겠습니다.목록이 완료되고 완료되지 않은 항목이 있습니다.이제 목록 개체에 목록 내 완료 항목과 완료되지 않은 항목의 수라는 두 가지 가상 속성을 추가합니다.json 출력에도 표시해 주었으면 합니다.

내 모델에는 미완성/완성 아이템을 가져오는 두 가지 방법이 있습니다.

def unfinished_items 
  self.items.where("status = ?", false) 
end 

def finished_items 
  self.items.where("status = ?", true) 
end

그러면 어떻게 하면 json 출력에서 이 두 가지 메서드의 카운트를 얻을 수 있을까요?

Rails 3.1을 사용하고 있습니다.

Rails의 객체 직렬화에는 두 가지 단계가 있습니다.

  • 첫번째,as_json개체를 단순화된 해시로 변환하기 위해 호출됩니다.
  • 그리고나서,to_json에서 호출됩니다.as_json값을 반환하여 최종 JSON 문자열을 가져옵니다.

당신은 대체로 떠나고 싶어 한다.to_json따라서 다음과 같이 자체 구현만 추가하면 됩니다.

def as_json(options = { })
  # just in case someone says as_json(nil) and bypasses
  # our default...
  super((options || { }).merge({
    :methods => [:finished_items, :unfinished_items]
  }))
end

다음과 같이 할 수도 있습니다.

def as_json(options = { })
  h = super(options)
  h[:finished]   = finished_items
  h[:unfinished] = unfinished_items
  h
end

메서드 기반 값에 다른 이름을 사용하는 경우.

XML 및 JSON 에 관심이 있는 경우는, 을 참조해 주세요.

레일 4에서는 다음을 수행할 수 있습니다.

render json: @my_object.to_json(:methods => [:finished_items, :unfinished_items])

이것이 최신/최신 버전에 있는 사람에게 도움이 되기를 바랍니다.

또 다른 방법은 모델에 추가하는 것입니다.

def attributes
  super.merge({'unfinished' => unfinished_items, 'finished' => finished_items})
end

이것은 xml 시리얼라이제이션에서도 자동적으로 동작합니다.http://api.rubyonrails.org/classes/ActiveModel/Serialization.html 단, 이 방법에서는 레일 3의 키를 정렬할 때 기호를 처리할 수 없기 때문에 키에 문자열을 사용하는 것이 좋습니다.하지만 4번 레일에 정렬되어 있지 않기 때문에 더 이상 문제가 없을 것입니다.

모든 데이터를 하나의 해시에 닫으면 됩니다.

render json: {items: items, finished: finished, unfinished: unfinished}

기존 as_json 블록에 통합하려는 저와 같은 사람에게 이 답을 제공해야겠다고 생각했습니다.

  def as_json(options={})
    super(:only => [:id, :longitude, :latitude],
          :include => {
            :users => {:only => [:id]}
          }
    ).merge({:premium => premium?})

그냥 택.merge({})마지막까지super()

이렇게 하면 추한 오버라이드를 하지 않아도 됩니다.모델이 있는 경우List예를 들어, 컨트롤러에 다음과 같이 설정할 수 있습니다.

  render json: list.attributes.merge({
                                       finished_items: list.finished_items,
                                       unfinished_items: list.unfinished_items
                                     })

Aswin은 위에 열거한 바와 같이:methods특정 모델의 메서드/함수를 json 속성으로 반환할 수 있습니다.복잡한 어소시에이션이 있는 경우 기존 모델/어소시에이션에 기능이 추가되기 때문에 이 기능은 유효합니다.D를 재정의하지 않으면 매력처럼 동작합니다.as_json

제가 어떻게 .:methods만 아니라:include[N+ 리;;;;;;;;;]

render json: @YOUR_MODEL.to_json(:methods => [:method_1, :method_2], :include => [:company, :surveys, :customer => {:include => [:user]}])

" " "as_json더이 시나리오에서는 이 더 ).:include "/ " " " " :/ def as_json(options = { }) end

개체의 배열을 가상 속성과 함께 렌더링하려면

render json: many_users.as_json(methods: [:first_name, :last_name])

서 ''는first_name ★★★★★★★★★★★★★★★★★」last_name되어 있는 속성입니다.

언급URL : https://stackoverflow.com/questions/6892044/add-virtual-attribute-to-json-output

반응형