Haskell Aeson嵌套数组JSON
我无法解析以下JSON结构中的标记。只有当我将其声明为Haskell Aeson嵌套数组JSON,json,haskell,aeson,Json,Haskell,Aeson,我无法解析以下JSON结构中的标记。只有当我将其声明为标记时,解析器才会工作:!数组当我将其声明为标签时失败::[Tag] 为什么? { “答复”:{ “状态”:“确定”, “结果”:[ { “类型”:“文章”, “字段”:{ “字数”:“497” }, “标签”:[ { “id”:“个人资料/巴里格伦登” } ] } ] } } 数据字段=字段{ 字数::Int }派生(显示) 实例FromJSON字段,其中 parseJSON(对象o)=字段(o.:“字数”) parseJSON=mzero
标记时,解析器才会工作:!数组
当我将其声明为标签时失败::[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
rNothing
对调试不是很有用,是吗
我成功地将您的示例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
。我希望伊森也能提供