【问题标题】:Haskell, Aeson - no instance for (ToJSON ByteString)Haskell, Aeson - (ToJSON ByteString) 没有实例
【发布时间】:2018-11-14 08:33:40
【问题描述】:

很高兴能走到这一步,但遇到了一个新障碍: 将此代码编码为 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

【问题讨论】:

  • 如果ByteString 在这里确实是正确的类型,那么您可能不应该将其转换为 JSON。请改用二进制序列化。如果这些字段实际上包含文本而不是二进制数据,则将类型设为 Text。如果它们确实包含二进制数据但您需要使用 JSON,请使用 base64 或类似的东西。

标签: haskell bytestring aeson


【解决方案1】:

那是因为ToJSON 类型类没有ByteString 实例。从历史上看,它曾经存在,但被删除了,因为 JSON 字符串应该是有效的 unicode。

您可以在此处找到更多详细信息:

为了修复它,我会将其转换为Text 类型,然后编码为 JSON。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多