Haskell Aeson嵌套数组JSON

Haskell Aeson嵌套数组JSON,json,haskell,aeson,Json,Haskell,Aeson,我无法解析以下JSON结构中的标记。只有当我将其声明为标记时,解析器才会工作:!数组当我将其声明为标签时失败::[Tag] 为什么? { “答复”:{ “状态”:“确定”, “结果”:[ { “类型”:“文章”, “字段”:{ “字数”:“497” }, “标签”:[ { “id”:“个人资料/巴里格伦登” } ] } ] } } 数据字段=字段{ 字数::Int }派生(显示) 实例FromJSON字段,其中 parseJSON(对象o)=字段(o.:“字数”) parseJSON=mzero

我无法解析以下JSON结构中的标记。只有当我将其声明为
标记时,解析器才会工作:!数组
当我将其声明为标签时失败::[Tag]

为什么?

{
“答复”:{
“状态”:“确定”,
“结果”:[
{
“类型”:“文章”,
“字段”:{
“字数”:“497”
},
“标签”:[
{
“id”:“个人资料/巴里格伦登”
}
]
}
]
}
}
数据字段=字段{
字数::Int
}派生(显示)
实例FromJSON字段,其中
parseJSON(对象o)=字段(o.:“字数”)
parseJSON=mzero
数据标签=标签{
id::Text
}派生(显示)
实例FromJSON标记,其中
parseJSON(对象o)=标记(o.:“id”)
parseJSON=mzero
数据搜索结果=搜索结果{
类型::文本,
字段::字段,
标记::!数组
}派生(显示)
实例FromJSON SearchResult,其中
parseJSON(对象o)=do
设t1=o.:“类型”
设t2=o.:“字段”
设t3=o.:“标签”
搜索结果t1 t2 t3
parseJSON=mzero
数据ContentrResult=ContentrResult{
结果::[SearchResult],
状态::文本
}派生(显示)
实例FromJSON ContentrResult,其中
parseJSON(对象o)=do

r
Nothing
对调试不是很有用,是吗

我成功地将您的示例JSON解析为
[Tag]
。我想知道您的错误是否与JSON中的
wordcount
字段是
字符串而不是
数字有关

下面是一个或多或少独立的示例,我将示例JSON wordcount更改为一个数字:

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}

module Main where

import Lib (str)

import Control.Monad (mzero)
import Data.Aeson
import qualified Data.ByteString.Lazy.Char8 as LBSC
import Data.Text

data Field = Field {
  wordcount :: Int
} deriving (Show)

instance FromJSON Field where
  parseJSON (Object o) = Field <$> o .: "wordcount"
  parseJSON _ = mzero

data Tag = Tag {
  id :: Text
} deriving (Show)

instance FromJSON Tag where
  parseJSON (Object o) = Tag <$> (o .: "id")
  parseJSON _ = mzero

data SearchResult = SearchResult {
  typ :: Text,
  fields :: Field,
  tags :: [Tag]
} deriving (Show)

instance FromJSON SearchResult where
  parseJSON (Object v) = SearchResult <$> v .: "type" <*> v .: "fields" <*> v .: "tags"
  parseJSON _ = mzero

data ContentrResult = ContentrResult {
  results :: [SearchResult],
  status :: Text
} deriving (Show)

instance FromJSON ContentrResult where
  parseJSON (Object v) = ContentrResult <$> v.: "results" <*> v .: "status"
  parseJSON _ = mzero

data Response = Response {
  response :: ContentrResult
} deriving (Show)

instance FromJSON Response where
  parseJSON (Object v) = Response <$> v .: "response"
  parseJSON _ = mzero

responseJson :: String
responseJson = [str|
  {
    "response": {
      "status": "ok",
      "results": [
        {
          "type": "article",
          "fields": {
            "wordcount": 497
          },
          "tags": [
            {
              "id": "profile/barryglendenning"
            }
          ]
        }
      ]
    }
  }
|]

main :: IO ()
main = do
  print r
  putStrLn ""
    where
      r :: Maybe Response
      r = decode (LBSC.pack responseJson)
{-#语言重载字符串}
{-#语言准语言}
模块主要在哪里
导入库(str)
进口管制.单子(mzero)
导入数据.Aeson
将限定数据.ByteString.Lazy.Char8作为LBSC导入
导入数据.Text
数据字段=字段{
字数::Int
}派生(显示)
实例FromJSON字段,其中
parseJSON(对象o)=字段o.:“字数”
parseJSON=mzero
数据标签=标签{
id::Text
}派生(显示)
实例FromJSON标记,其中
parseJSON(对象o)=标记(o.:“id”)
parseJSON=mzero
数据搜索结果=搜索结果{
类型::文本,
字段::字段,
标签::[标签]
}派生(显示)
实例FromJSON SearchResult,其中
parseJSON(对象v)=搜索结果v.:“类型”v.:“字段”v.:“标记”
parseJSON=mzero
数据ContentrResult=ContentrResult{
结果::[SearchResult],
状态::文本
}派生(显示)
实例FromJSON ContentrResult,其中
parseJSON(对象v)=内容结果v.:“结果”v.:“状态”
parseJSON=mzero
数据响应=响应{
响应::ContentrResult
}派生(显示)
实例FromJSON响应,其中
parseJSON(对象v)=响应v.:“响应”
parseJSON=mzero
responseJson::字符串
responseJson=[str|
{
“答复”:{
“状态”:“确定”,
“结果”:[
{
“类型”:“文章”,
“字段”:{
“字数”:497
},
“标签”:[
{
“id”:“个人资料/巴里格伦登”
}
]
}
]
}
}
|]
main::IO()
main=do
印刷机
putStrLn“”
哪里
r:也许是回应
r=解码(LBSC.pack responseJson)

没有任何东西对调试不是很有用,是吗

我成功地将您的示例JSON解析为
[Tag]
。我想知道您的错误是否与JSON中的
wordcount
字段是
字符串而不是
数字有关

下面是一个或多或少独立的示例,我将示例JSON wordcount更改为一个数字:

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}

module Main where

import Lib (str)

import Control.Monad (mzero)
import Data.Aeson
import qualified Data.ByteString.Lazy.Char8 as LBSC
import Data.Text

data Field = Field {
  wordcount :: Int
} deriving (Show)

instance FromJSON Field where
  parseJSON (Object o) = Field <$> o .: "wordcount"
  parseJSON _ = mzero

data Tag = Tag {
  id :: Text
} deriving (Show)

instance FromJSON Tag where
  parseJSON (Object o) = Tag <$> (o .: "id")
  parseJSON _ = mzero

data SearchResult = SearchResult {
  typ :: Text,
  fields :: Field,
  tags :: [Tag]
} deriving (Show)

instance FromJSON SearchResult where
  parseJSON (Object v) = SearchResult <$> v .: "type" <*> v .: "fields" <*> v .: "tags"
  parseJSON _ = mzero

data ContentrResult = ContentrResult {
  results :: [SearchResult],
  status :: Text
} deriving (Show)

instance FromJSON ContentrResult where
  parseJSON (Object v) = ContentrResult <$> v.: "results" <*> v .: "status"
  parseJSON _ = mzero

data Response = Response {
  response :: ContentrResult
} deriving (Show)

instance FromJSON Response where
  parseJSON (Object v) = Response <$> v .: "response"
  parseJSON _ = mzero

responseJson :: String
responseJson = [str|
  {
    "response": {
      "status": "ok",
      "results": [
        {
          "type": "article",
          "fields": {
            "wordcount": 497
          },
          "tags": [
            {
              "id": "profile/barryglendenning"
            }
          ]
        }
      ]
    }
  }
|]

main :: IO ()
main = do
  print r
  putStrLn ""
    where
      r :: Maybe Response
      r = decode (LBSC.pack responseJson)
{-#语言重载字符串}
{-#语言准语言}
模块主要在哪里
导入库(str)
进口管制.单子(mzero)
导入数据.Aeson
将限定数据.ByteString.Lazy.Char8作为LBSC导入
导入数据.Text
数据字段=字段{
字数::Int
}派生(显示)
实例FromJSON字段,其中
parseJSON(对象o)=字段o.:“字数”
parseJSON=mzero
数据标签=标签{
id::Text
}派生(显示)
实例FromJSON标记,其中
parseJSON(对象o)=标记(o.:“id”)
parseJSON=mzero
数据搜索结果=搜索结果{
类型::文本,
字段::字段,
标签::[标签]
}派生(显示)
实例FromJSON SearchResult,其中
parseJSON(对象v)=搜索结果v.:“类型”v.:“字段”v.:“标记”
parseJSON=mzero
数据ContentrResult=ContentrResult{
结果::[SearchResult],
状态::文本
}派生(显示)
实例FromJSON ContentrResult,其中
parseJSON(对象v)=内容结果v.:“结果”v.:“状态”
parseJSON=mzero
数据响应=响应{
响应::ContentrResult
}派生(显示)
实例FromJSON响应,其中
parseJSON(对象v)=响应v.:“响应”
parseJSON=mzero
responseJson::字符串
responseJson=[str|
{
“答复”:{
“状态”:“确定”,
“结果”:[
{
“类型”:“文章”,
“字段”:{
“字数”:497
},
“标签”:[
{
“id”:“个人资料/巴里格伦登”
}
]
}
]
}
}
|]
main::IO()
main=do
印刷机
putStrLn“”
哪里
r:也许是回应
r=解码(LBSC.pack responseJson)

您得到的确切错误是什么?这可能与您的问题无关,但我不会命名记录字段
id
,因为这样您会对前奏产生歧义。顺便说一下,命名字段
类型
是一个语法错误没有错误,我只得到一个nothing,因为它在这里工作,模块化我已经提到的错误,加上wordcount的类型不匹配,当它是json中的字符串时,解析为
Int
。我希望伊森也能提供