Haskell,Aeson - 没有(ToJSON ByteString)的实例。

7

很高兴你可以做到这一步,但遇到了新的障碍: 我编写了将其编码为JSON的代码。然而,无论我使用哪种类型作为实例,编译器都会抱怨。现在显然我正在做错什么,但这正是文档中所说的(当然是使用DeriveGeneric时)。

{-# LANGUAGE OverloadedStrings, DeriveGeneric #-}

import Data.Aeson
import Data.Text as T
import Data.ByteString.Lazy as B
import Data.ByteString.Lazy.Char8 as BC
import GHC.Generics

-- decode :: FromJSON a => B.ByteString -> Maybe a
-- decode' :: FromJSON a => B.ByteString -> Either String a
-- encode :: ToJSON => a -> B.ByteString

data System = System  { system :: BC.ByteString
                  , make :: BC.ByteString
                  , code :: Int
                  } deriving (Generic, Show)
instance ToJSON System
-- instance FromJSON System

platform = System { system = "FPGA"
                  , make = "Xilinx"
                  , code = 10165
                  }
encodePlatform :: BC.ByteString
encodePlatform = encode platform

编译器输出:
    • No instance for (ToJSON ByteString)
        arising from a use of ‘aeson-1.4.1.0:Data.Aeson.Types.ToJSON.$dmtoJSON’
    • In the expression:
        aeson-1.4.1.0:Data.Aeson.Types.ToJSON.$dmtoJSON @(System)
      In an equation for ‘toJSON’:
          toJSON = aeson-1.4.1.0:Data.Aeson.Types.ToJSON.$dmtoJSON @(System)
      In the instance declaration for ‘ToJSON System’
   |
17 | instance ToJSON System

2
如果 ByteString 在此处确实是正确的类型,那么你应该避免将其转换为 JSON。而应该使用二进制序列化。如果这些字段实际上包含文本而不是二进制数据,则应使用 Text 类型。如果它们确实包含二进制数据但你必须使用 JSON,则可以使用 base64 或类似的方式进行转换。 - leftaroundabout
1个回答

12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接