haskell Data.Aeson.Value到文本
我想要的是这样的文本haskell Data.Aeson.Value到文本,haskell,Haskell,我想要的是这样的文本 data User = User { city :: Text , country :: Text , phone :: Text , email :: Text} instance ToJSON User where toJSON (User a b c d)= object ["a" .= a
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
我想不出如何从值转换成文本,因为(我认为)这是一个普遍有用的函数,所以要做到这一点比它应该做的要困难得多
Data.Aeson.Encode.Encode
做了太多的工作,并通过testring将其转换为ByTest
从encode
开始,然后将Lazy.Text->ByteString
切换到Lazy.Text->Strict.Text
转换可以实现您想要的功能:
test::User -> IO Text
test u = do
let j = pack ("{\"city\":\"test\",\"country\":\"test\",\"phone\":\"test\",\"email\":\"test\"}")
return j
根据Thomas的评论:您不会从
Value
转到Text
,而是从Value
转到ByteString
。sendTextData
函数的多态性足以接受ByteString
s.我想我不理解这个问题,但您不想要Data.Text.Lazy.Builder.toLazyText吗。Data.Aeson.Encode.fromValue
?我想要实现的是test::User->IO Text
,其中我的数据被转换为文本。两个测试的输出应该是相同的。无论如何,严格的文本生成器是没有意义的。您可以使用Data.text.lazy.toStrict
将惰性文本转换为严格文本。您知道如何读取haddock吗sendTextData
是多态的。懒惰和严格的bytestring和文本都是实例。@ThomasM.DuBuisson,不,fromJSON
不是您想要的。它用于反序列化JSON值,因此Text
的FromJSON
实例只解析String“一个JSON字符串”::Value
,换句话说:根本不是您要查找的内容。fromValue
函数是一个不错的选择。我想你的意思是说import Data.Aeson.Encode(encodetotexbuilder)
。
{-# 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