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