Haskell - Aeson:尝试解码 JSON URL Req 时得到“Nothing”

2023-12-08

我对 Haskell 比较陌生,现在我正在尝试更深入地了解并尝试习惯不同的流行库。

现在我正在尝试“aeson”。

我想要做的是解析来自的 MSFT 报价请求

这就是它的样子

{
    "Global Quote": {
        "01. symbol": "MSFT",
        "02. open": "105.3500",
        "03. high": "108.2400",
        "04. low": "105.2700",
        "05. price": "107.6000",
        "06. volume": "23308066",
        "07. latest trading day": "2018-10-11",
        "08. previous close": "106.1600",
        "09. change": "1.4400",
        "10. change percent": "1.3564%"
    }
}

这就是我到目前为止所得到的

{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE OverloadedStrings #-}

import           Data.Aeson
import qualified Data.ByteString.Lazy as B
import           GHC.Exts
import           GHC.Generics
import           Network.HTTP
import           Network.URI

jsonURL :: String
jsonURL = "http://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol=MSFT&apikey=demo"

getRequest_ :: HStream ty => String -> Request ty
getRequest_ s = let Just u = parseURI s in defaultGETRequest_ u

jsonReq = getRequest_ jsonURL

data Quote = Quote {quote         :: String,
                    symbol        :: String,
                    open          :: Float,
                    high          :: Float,
                    low           :: Float,
                    price         :: Float,
                    volume        :: Float,
                    ltd           :: String,
                    previousClose :: Float,
                    change        :: Float,
                    changePerct   :: Float
                   } deriving (Show, Generic)

instance FromJSON Quote
instance ToJSON Quote


main :: IO ()
main = do
  d <- simpleHTTP jsonReq
  body <- getResponseBody d
  print (decode body :: Maybe Quote)

我究竟做错了什么?

编辑:答案中的固定版本。


首先:Aeson是对于初学者来说不是最简单的库。当然,还有更困难的问题,但它假设您已经了解了相当多的关于该语言的知识。您一开始就没有选择“最简单的任务”。我知道这可能会令人惊讶,并且您可能认为解析 JSON 应该很简单,但解析具有强类型保证的 JSON 实际上并不那么简单。

但我可以告诉你一些对你有帮助的事情:

  • 首先,使用eitherDecode而不是decode:您将收到一条错误消息,而不仅仅是Nothing,这会对你有一点帮助。

  • 推导通过Generic很简洁,而且通常可以节省时间,但这也不是魔法。对象键的名称和数据类型字段的名称必须完全匹配。遗憾的是,这里的情况并非如此,并且由于 haskell 语法,您无法像对象的键一样命名字段。最好的解决方案是手动实现 FromJSON(请参阅下面的推荐链接)。查看通用 FromJSON 的“预期内容”的一个好方法是还派生 ToJSON,创建一个虚拟对象Quote并查看结果encode.

  • 您的第一个字段(quote) 不是对象本身的键,而是该对象的名称。所以你有动态键(“全局报价”就是这里的一个)。同样,这通常是您想要手动编写 FromJSON 实例的情况。

我推荐你读一下这本著名的Artyom Kazak 编写的教程在艾森.这将对你有很大帮助,并且可能是我能给出的最好建议。

对于您的手动实例,假设是exactly您想要解析的文档,并且您只需要处理“全局报价”,它看起来或多或少像这样:

instance ToJSON Quote where
  parseJSON = withObject "Document" $
    \d -> do
        glob <- d .: "Global Quote"
        withObject "Quote" v (\gq ->
          Quote <$> gq .: "01. symbol"
                <*> pure "Global Quote"
                <*> gq .: "02. open"
                <*> gq .: "03. high"
          -- ... and so on
         ) v

(这不是最漂亮的方式,也不是最好的方式,但它应该是一种可能的方式)。

另请注意,正如一位精明的评论者所写,字段的类型并不总是与示例 JSON 文档的类型一致。 “体积”是一个Int(字节限制的 int),可能是Integer(“数学”整数,无界限),但不是Float。您的“ltd”可以解析为一个字符串 - 但它可能应该是一个日期(Day from Data.Time将是第一选择 - 它已经有一个FromJSON实例,所以很可能它应该可以按原样解析)。变化百分比很可能无法像这样解析为 Float ,您需要为这种类型编写一个专用的解析器(并决定如何存储它 -Ratio是一个潜在的解决方案)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell - Aeson:尝试解码 JSON URL Req 时得到“Nothing” 的相关文章

  • 使用 VB.NET 覆盖文本文件中的特定行

    我需要执行以下操作 更改文本文件中的行 Path c this certain path 用这条线 Path c that other newer path 这些路径的长度肯定会不同 因此我需要替换引号中的内容 或者完全擦除该行并输入一个新
  • 如何使用 string#split 用分隔符 + - * / ( ) 和空格分割字符串并将它们保留为额外标记?

    我需要拆分包含基本数学表达式的字符串 例如 a b c or a c d 分隔符是 和空格 我需要它们作为独立的标记 基本上结果应该是这样的 a b c 对于第二个例子 a 我读了很多关于具有不太复杂的分隔符的类似问题的问题 常见的答案是使
  • Android Volley 服务器错误

    I am posting data all strings to varchar variables in server but i am getting volley server error or badnetwork performa
  • Rails 可以自动解析从表单 text_field 收到的日期时间吗

    Rails 可以自动解析从表单的文本字段接收到的日期时间吗 in view div class field br div in controller params product updated at yesterday 目前我收到以下错误
  • iPhone iOS 是否有用于类似代数计算器的应用程序的表达式解析器?

    我正在构建一个应用程序 可以通过加速度计和陀螺仪输出来分析手机的运动 我很可能会将这个动作捕获为一组变量 应用程序将在内部跟踪这些变量 我试图提供一种方法来绘制这些变量和涉及这些变量的方程 我想让用户能够通过输入 a b c d 等方程 其
  • 在 jQuery 中获取 Json 数据

    没有一个清晰的示例解释如何尽可能简单地拉取 json 数据 我有一个有效的 json 我需要使用 jQuery 检索它 我的 json 输出如下 title blog entries items title Can Members of t
  • 当我调用 Haskell 子字符串函数时,为什么会收到“函数中的非详尽模式...”?

    我正在努力读完这本书Haskell 通向逻辑 数学和编程之路 https rads stackoverflow com amzn click com 0954300696 我才读到第一章的一半 但到目前为止我很享受它并打算继续 我已经阅读了
  • 为什么我无法解开根节点并反序列化对象数组?

    为什么我无法通过展开根节点来反序列化对象数组 import java io IOException import java util Arrays import java util List import org codehaus jack
  • 如何在Haskell中定义一个允许统一访问不同记录的类?

    我有两条记录 它们都有一个我想要提取以显示的字段 我如何安排事物以便可以使用相同的功能来操纵它们 由于它们有不同的字段 在本例中firstName and buildingName 这是它们的名称字段 它们每个都需要一些 适配器 代码来映射
  • Beautiful Soup 获取动态表数据

    我有以下代码 url https www basketball reference com leagues NBA 2017 standings html all expanded standings html urlopen url so
  • Show for String的实例是怎么写的?

    我有一个关于定义类型类实例的基本问题 我使用 Show 类型类作为示例 并且只考虑类中的 show 函数 像 Bool 这样的具体类型的 Show 实例很简单 instance Show Bool where show x function
  • 如何读取本地 JSON 文件进行测试

    我正在尝试编写用于 json 验证的单元测试 因为该应用程序严重依赖于来自 REST API 的 json 我有一个包含简单 json 的本地文件 goodFeaturedJson txt 内容 test TEST 测试用例 void te
  • Facebook Graph API 使用 json 和 C# 检索好友

    我正在使用 C 和 Graph API 进行工作 并且能够获取 Facebook 用户个人资料信息 例如 ID 姓名和电子邮件 然后反序列化 JSON 以便能够将值分配给标签 然而 我的问题是 当我去获取好友列表或任何与此相关的列表时 如何
  • 使用 Vercel 进行 Vue.js 历史记录模式的服务器配置?

    我设置了一个非常基本的 Vue js 应用程序 主要使用这些步骤 https auth0 com docs quickstart spa vuejs 01 login 当我将路由器添加到该项目时 它询问我是否要使用历史模式 我说是 现在我正
  • 双共体的方法是什么?

    在思考建议哪些更有用的标准课程时到这个 https stackoverflow com a 40833245 745903 class Coordinate c where createCoordinate x gt y gt c x y
  • Haskell:去掉 liftM2 中的括号

    如何去掉标有的括号 而不引入新名称 如果能分成多行就更好了 liftM2 somefunc arg1 get arg2 somefunc arg3 get arg3 您可以使用以下方法删除最后一个 但另一个显然不能在不引入新名称的情况下被删
  • WCF 自定义序列化器

    我正在 WCF 中创建一个返回 JSON 的 Web 服务 但 DataContractJsonSerializer 对某些循环引用犹豫不决 在这种特殊情况下我无法删除这些引用 相反 我想使用 Newtonsoft json 库 在 WCF
  • 运行程序的最佳 Haskell 库是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 如果我要将一个程序投入生产 我需要该程序做几件事才能将其视为 可操作 也就是说 工程师和操作人员以可测量
  • 使用 JSON 传递 HTML

    我正在使用 JSON 将数据传递到 iPhone 和 iPad 数据的一个字段是 HTML 问题是编码 这是我得到的回复 gt GadgetHTML strong Hello strong gt from Catworld br n img
  • Haskell 中动态规划的高效表

    我已经编码了0 1背包问题 http en wikipedia org wiki Knapsack problem 0 1 knapsack problem在哈斯克尔 我对迄今为止所取得的懒惰和普遍性水平感到相当自豪 我首先提供用于创建和处

随机推荐

  • 使用 Jersey 2 (HK2) DI 注册 Dropwizard 配置

    在我的 Dropwizard 1 2 4 应用程序中 我无法将 Dropwizard 配置注入到由 HK2 实例化的类中 实现这一目标的最佳方法是什么 只需绑定配置即可instance Override public void run fi
  • 我可以信任 Java SecurityManager 沙箱吗?

    我正在编写一个 JavaFX2 应用程序 它接受从远程位置加载的任意代码 对我来说 使用自定义 SecurityManager ClassLoader 和 ProtectionDomain 是最佳选择 不幸的是 这似乎与用于沙箱小程序的设置
  • 手动指定特定链接符号的重新映射

    在不修改这两个源文件的情况下 有没有办法获取编译它们生成的目标文件 并说服链接器链接foo在 main v1 c 中bar在bar c main v1 c void foo void int main void foo bar c incl
  • JavaScript 是多线程的吗?

    这是我的问题 我需要使用 jQuery getScript 动态下载多个脚本并执行某些JavaScript加载所有脚本后的代码 所以我的计划是做这样的事情 function GetScripts scripts callback var l
  • Python 和 C++ 模数

    我正在学习 C 在尝试编写一个小程序时 我发现了一些奇怪的东西 这是关于模数 C 代码 cout lt lt 325 325 100 lt lt endl 300 cout lt lt 325 325 100 300 和Python代码 p
  • 关于泛型方法调用的 Java 类型提示

    我想知道调用具有如下签名的静态方法的正确方法是什么 public static
  • 如何获取单选按钮的文本(而不是值)

    我知道我可以获取单选按钮的 值 属性 但我发现获取单选按钮的文本非常困难 考虑下面的例子 它有 3 个单选按钮 并尝试提醒第一个单选按钮的值 红色 然后尝试提醒单选按钮的文本 苹果 但失败了 获取几乎任何元素的文本都可以使用 elem ch
  • 正则表达式在文件夹中查找文件

    如何查找文件夹中与正则表达式模式匹配的所有文件 Thanks The GetFiles方法允许您指定通配符模式 但不是真正的正则表达式 另一种可能性是简单地循环遍历文件并根据正则表达式验证它们的名称 IEnumerable
  • 将图像大小调整到给定边界区域的最简单方法是什么?

    我想创建一个函数 例如 def generateThumbnail self width height Generates thumbnails for an image im Image open self file im thumbna
  • MYSQLi 错误:用户已经拥有超过“max_user_connections”的活动连接[重复]

    这个问题在这里已经有答案了 我正在运行的网站上出现以下错误 我不明白为什么会这样 因为它在我的本地主机上运行良好 跟楼主有关系吗 我在 Unix 服务器上 Warning mysqli mysqli mysqli mysqli 42000
  • NodeJS 将 Int16Array 二进制缓冲区转换为 Google Speech API 的 LINEAR16 编码原始流

    我正在尝试在节点服务器中将语音转换为文本 其中使用 AudioContext 在浏览器中进行语音录制 我能够通过binaryType arraybuffer的WebSocket连接将int16Array缓冲区 记录的数据 发送到我的节点服务
  • 从列号获取 Excel 样式的列名称

    这是在提供行和列 ID 时提供列名称的 代码 但当我给出如下值时row 1 and col 104 它应该返回CZ 但它返回D row 1 col 104 div col column label str while div div mod
  • 如何从左到右移动uiview,反之亦然

    您好 我正在开发一个应用程序 我为一个视图制作了从左到右 从右到左移动的动画 并更改该视图中包含的标签的值 但是当我单击左或右按钮时 该视图将被删除新视图覆盖旧视图 所以我不想覆盖 只是我想添加新视图 我的代码是 void centerAn
  • 文本文件的行数

    我正在尝试创建一个函数 它接受文件名 即 data txt 并生成该文件的行数 data txt 24 42 45 54 67 76 89 98 12 21 99 99 33 33 下面的代码是我尝试构建一个函数 该函数接受文件名 data
  • mongoose 和 mongoJS 有什么区别?我应该使用哪个?

    我只是想知道 mongoose 和 mongoJS 有什么区别 那么 如果我们使用 mongoose 或 mongoJS 有何优点和缺点 因为我们知道连接 NodeJS 和 MongoDB 有很多依赖关系 例如猫鼬和 mongoJS Mon
  • 如何从 HTML 文件中提取元标签并在 SOLR 和 TIKA 中对其进行索引

    我正在尝试提取 HTML 文件的元标签 并通过 tika 集成将它们索引到 solr 中 我无法使用 Tika 提取这些元标记 也无法在 solr 中显示 我的 HTML 文件看起来像这样
  • 嵌套对象的默认值

    假设我有以下提供默认值的对象 default values a 0 b 0 c aa 0 bb 0 我还有另一个对象可以覆盖其中一些默认值 override values a 5 c aa 5 我想要的是将这两个对象结合起来 从而产生 co
  • 使用 C# 通过 Skype 进行通话

    我想开发一个盲人辅助软件 比如Jarvis 它是一个 C 表单应用程序 我需要将我的 C 项目与 Skype API 连接起来 以便使用 Skype 调用某个用户名 当我使用命令时Call John 它通过 Skype 呼叫 John 进行
  • 在 NodeJS 协议中实现 STARTTLS

    我正在尝试将 STARTTLS 升级添加到现有协议 当前以纯文本形式运行 首先 我使用一个简单的基于行的回显服务器 这是一个可怕的组装 没有错误处理或将数据包处理成行 但它通常只是在控制台一次发送一行到标准输入时工作 我认为我的服务器是正确
  • Haskell - Aeson:尝试解码 JSON URL Req 时得到“Nothing”

    我对 Haskell 比较陌生 现在我正在尝试更深入地了解并尝试习惯不同的流行库 现在我正在尝试 aeson 我想要做的是解析来自的 MSFT 报价请求 这就是它的样子 Global Quote 01 symbol MSFT 02 open