수색…


제네릭을 사용한 스마트 인코딩 및 디코딩

Aeson에서 하스켈 데이터 유형을 JSON으로 인코딩하는 가장 쉽고 빠른 방법은 제네릭을 사용하는 것입니다.

{-# LANGUAGE DeriveGeneric #-}

import GHC.Generics
import Data.Text
import Data.Aeson
import Data.ByteString.Lazy    

먼저 데이터 유형 Person을 작성하겠습니다.

data Person = Person { firstName :: Text
                     , lastName  :: Text
                     , age       :: Int 
                     } deriving (Show, Generic)

Data.Aeson 패키지에서 encodedecode 함수를 사용하려면 PersonToJSONFromJSON 의 인스턴스로 FromJSON 합니다. 우리는 Generic for Person 을 파생 Generic 클래스에 대해 빈 인스턴스를 만들 수 있습니다. 메소드의 기본 정의는 Generic 유형 클래스가 제공하는 메소드로 정의됩니다.

instance ToJSON Person
instance FromJSON Person

끝난! 인코딩 속도를 향상시키기 위해 ToJSON 인스턴스를 약간 변경할 수 있습니다.

instance ToJSON Person where
    toEncoding = genericToEncoding defaultOptions

이제 encode 함수를 사용하여 Person 을 (게으른) Bytestring으로 변환 할 수 있습니다.

encodeNewPerson :: Text -> Text -> Int -> ByteString
encodeNewPerson first last age = encode $ Person first last age

그리고 우리가 사용할 수있는 디코딩하는 decode :

> encodeNewPerson "Hans" "Wurst" 30
"{\"lastName\":\"Wurst\",\"age\":30,\"firstName\":\"Hans\"}"


> decode $ encodeNewPerson "Hans" "Wurst" 30
Just (Person {firstName = "Hans", lastName = "Wurst", age = 30})

Data.Aeson.Value를 생성하는 빠른 방법

{-# LANGUAGE OverloadedStrings #-}
module Main where

import Data.Aeson

main :: IO ()
main = do
  let example = Data.Aeson.object [ "key" .= (5 :: Integer), "somethingElse" .= (2 :: Integer) ] :: Value
  print . encode $ example

선택적 필드

때로는 JSON 문자열의 일부 필드를 선택적으로 사용하기를 원합니다. 예를 들어,

data Person = Person { firstName :: Text
                     , lastName  :: Text
                     , age       :: Maybe Int 
                     }

이것은 다음에 의해 달성 될 수있다.

import Data.Aeson.TH

$(deriveJSON defaultOptions{omitNothingFields = True} ''Person)


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow