7
data User = User { city :: Text
                 , country :: Text
                 , phone :: Text
                 , email :: Text}

instance ToJSON User where
    toJSON (User a b c d)= object ["a" .= a
                                  ,"b" .= b
                                  ,"c" .= c
                                  ,"d" .= d]

test:: User -> IO Value
test u = do
    let j = toJSON u
    return j

私が欲しいのはそのようなテキストです

test::User -> IO Text
test u = do
    let j = pack ("{\"city\":\"test\",\"country\":\"test\",\"phone\":\"test\",\"email\":\"test\"}")
    return j

値からテキストに移行する方法がわかりません

4

2 に答える 2

14

これを行うのは、(私が思うに)一般的に便利な機能であるため、本来あるべきよりも困難です。Data.Aeson.Encode.encodeはあまりにも多くの作業を行い、それをずっと に変換しますByteString

から始めて変換encodeに切り替えると、必要なことが行われます。Lazy.Text -> ByteStringLazy.Text -> Strict.Text

{-# LANGUAGE OverloadedStrings #-}

import Data.Aeson
import Data.Aeson.Encode (fromValue)
import Data.Text
import Data.Text.Lazy (toStrict)
import Data.Text.Lazy.Builder (toLazyText)

data User = User
  { city    :: Text
  , country :: Text
  , phone   :: Text
  , email   :: Text
  }

instance ToJSON User where
  toJSON (User a b c d) = object
    [ "city"    .= a
    , "country" .= b
    , "phone"   .= c
    , "email"   .= d
    ]

test :: User -> Text
test = toStrict . toLazyText . encodeToTextBuilder . toJSON
于 2012-08-16T18:57:56.533 に答える
1

トーマスのコメントによると、 から に行くのではなく、 からにValue行きます。この関数は、s を受け入れるのに十分な多形性を備えています。TextValueByteStringsendTextDataByteString

于 2012-08-17T10:06:16.433 に答える