Haskell, Aeson - нет экземпляра для (ToJSON ByteString) - PullRequest
0 голосов
/ 14 ноября 2018

Так рад, что зашел так далеко, столкнулся с новым препятствием: получил этот код, созданный для кодирования в 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

1 Ответ

0 голосов
/ 14 ноября 2018

Это потому, что для класса ToJSON нет экземпляра ByteString. Исторически он присутствовал, но был удален, потому что строки JSON должны быть действительными в Юникоде.

Более подробную информацию вы можете найти здесь:

Для исправления я конвертировал бы его в тип Text, а затем закодировал в JSON.

...