json - Haskell,Aeson:使用部分不必要的值解析嵌套的 JSON
问题描述
我是一个初学者,试图通过解析我在网上找到的一些 json 文件来了解更多关于 Haskell 和 Aeson 的信息。
我有一个.json
看起来像这样的
"Abilities": {
"Prime": {
"Ammo": 210,
"Available": true,
"Diposition": 3,
"Type": "Secondary",
"Class": "Pistols",
"NormalAttack": {
"Chance": 0.25,
"Streak": 2,
"Rate": 2.67,
"ShotType": "Hit-Scan",
"Damage": {
"Front": 15,
"Back": 15,
"Up": 120,
"Down": 40
},
"Status": 0.25
}
"Accuracy": 9.8,
"Reload": 3,
"Name": "Prime",
"Magazine": 16,
},
"Dual": {
"Name": "Dual",
"Available": true,
"Diposition": 4,
"Class": "Swords",
"Type": "Melee",
"NormalAttack": {
"Chance": 0.25,
"Streak": 3,
"Rate": 1.08,
"Damage": {
"Down": 35
},
"Status": 0.15
}
}
}
该文件包含一些我需要的信息,但主要是我不需要的信息。
这是我迄今为止尝试过的
{-# LANGUAGE DeriveGeneric #-}
module Lib
( someFunc
) where
import Data.Aeson
import Data.HashMap.Strict as HS
import Data.Maybe
import Data.Text
import Data.Map.Strict
import GHC.Generics
location = "src/this.json"
someFunc :: IO ()
someFunc = putStrLn "someFunc"
data Abilities = Abilities { abilities :: Map String Ability } deriving (Generic, Show)
instance FromJSON Abilities where
parseJSON = withObject "Abilities" $
\v -> Abilities
<$> v .: pack "Abilities"
data Ability = Ability { ammo :: Double
, normalAttack :: Effect
, accuracy :: Double
, name :: String
, diposition :: Double
, reload :: Double
} deriving (Generic, Show)
instance FromJSON Ability where
parseJSON = withObject "Ability" $
\v -> Ability
<$> v .: pack "Ammo"
<*> v .: pack "NormalAttack"
<*> v .: pack "Accuracy"
<*> v .: pack "Name"
<*> v .: pack "Diposition"
<*> v .: pack "Reload"
data Effect = Effect { chance :: Double
, streak :: Double
, rate :: Double
, damage :: Damage
, status :: Double
} deriving (Generic, Show)
instance FromJSON Effect where
parseJSON = withObject "Effect" $
\v -> Effect
<$> v .: pack "Chance"
<*> v .: pack "Streak"
<*> v .: pack "Rate"
<*> v .: pack "Damage"
<*> v .: pack "Status"
data Damage = Damage { front :: Double
, back :: Double
, up :: Double
, down :: Double
} deriving (Generic, Show)
instance FromJSON Damage where
parseJSON = withObject "Damage" $
\v -> Damage
<$> v .: pack "Front"
<*> v .: pack "Back"
<*> v .: pack "Up"
<*> v .: pack "Down"
main = do
x <- eitherDecodeFileStrict location :: IO (Either String Abilities)
print x
我知道解析信息的几种不同方法
通过解析文件 has
Aeson Value
orAeson Object
并申请Data.HashMap.Strict.toList
将其转换为[(k, v)]
. 麻烦的是,在一个大文件上,这种方法变得非常混乱。通过使用
unConstructor
像这样工作的几个函数
unConstruct (Constructor x) = case (Constructor x) of
Constructor x -> x
但同样的问题:它变得非常不可读并且非常混乱。
这就是为什么我要解析.json
文件,如上面的代码所示。
但是解析在代码中的某处失败,因为我得到Nothing
了输出。
该.json
文件似乎很好,因为如果我使用
main = do
x <- decodeFileStrict location :: IO (Maybe Object)
print x
它工作得很好,使用适当的默认 aeson 数据类型打印文件的内容。
我可能做错了什么?
编辑:实施了@danidiaz 在评论中建议的修复。
错误信息:Left "Error in $.Abilities['someAbility']: key \"Ammo\" not present"
解决方案
推荐阅读
- php - WordPress 调试问题:无法添加菜单项或新页面
- javascript - JS排序对象数组,里面有数组
- vuejs2 - 如何动态更改输入类型
- web-scraping - Scrapy - 即使添加标题后也无法解决 403 错误
- sql - BQ & Tableau - 创建一个包含 200 万行数据和两个源的 tableau 数据源。请指教
- angular - 如何对使用 Observable 的 Angular Material Table 列进行过滤
作为数据源 - java - 为什么我不能将 @Scheduled 与外部化的 Spring Cloud 属性文件一起使用?
- python-3.x - KeyError:使用 Office REST python API 时出现“office365_python_sdk_securevars”
- java - Android 键盘调整大小在全屏模式下不起作用
- kubernetes - 当 pod 中的代码在 hpa 缩减时运行时会发生什么?