You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Servant 0.18.3实现嵌套API时提示User缺少ToJSON实例如何解决?

问题修复方案

错误根因

你当前的报错完全是类型实例缺失导致的,和Servant、aeson的版本兼容无关:
你的API定义中大量使用了'[JSON]格式的请求/响应声明,Servant依赖aeson库完成Haskell类型和JSON格式的互转,要求对应的业务类型必须实现ToJSON(序列化返回给客户端)和FromJSON(反序列化客户端提交的请求体)两个类型类实例,你当前的User、Product类型都没有实现这两个实例。

具体修改步骤

1. 新增语言扩展和依赖导入

在Nested.hs的头部语言扩展列表中新增DeriveAnyClass扩展,同时导入aeson的类型类:

-- 新增DeriveAnyClass扩展
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}

module Nested where

-- 新增aeson导入
import Data.Aeson (ToJSON, FromJSON)
import Data.Time.Calendar (Day)
import GHC.Generics (Generic)
import Servant

2. 给User类型补全JSON实例派生

利用已经开启的DeriveGeneric和DeriveAnyClass扩展,自动生成JSON实例:

data User = User
  { name :: String,
    age :: Int,
    email :: String,
    registration_date :: Day
  }
  deriving (Eq, Show, Generic, ToJSON, FromJSON)

3. 给Product类型补全派生声明

Product类型当前连Generic派生都没有,需要同步补上:

newtype Product = Product {productId :: Int}
  deriving (Eq, Show, Generic, ToJSON, FromJSON)

验证效果

修改完成后重新编译,就不会再出现No instance for ToJSON User的报错。你当前代码中所有Handler用error实现的占位逻辑可以后续替换为实际的业务逻辑,不影响编译通过。

内容的提问来源于stack exchange,提问作者Waifu_Forever

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:36:01