我正在Haskell中研究JSON数据编码器!(更具体地说,我正在尝试将Jo移植到Haskell中!)我已经让它工作了很多,但我遇到了一个小问题。我会尽量简明扼要地回答我的问题,我已经尽可能地去掉了不需要的上下文。
目标:给定String
,构造一个Value
。
这些字符串来自命令行:用户以<key>=<value>
的形式输入键/值对。在将它们分开后,我留下了一个String
,这是未知类型的值数据。
示例案例:
let s = "someString" -- use the `String` constructor
let s = "1234" -- use the `Number` constructor
let s = "True" -- use the `Bool` constructor
问题:我如何推断s
的内容是String
而不是Number
,Bool
等?
这是AesonValue
类型的相关类型+构造函数(为简洁而编辑)。
data Value = Object Object
| Array Array
| String Text
| Number Scientific
| Bool Bool
| Null
既然您已经在使用aeson包,那么您可以使用decode。这是因为Value
也是ByteString
实例:
Prelude Data.Aeson> decode ""someString"" :: Maybe Value
Just (String "someString")
Prelude Data.Aeson> decode "1234" :: Maybe Value
Just (Number 1234.0)
Prelude Data.Aeson> decode "true" :: Maybe Value
Just (Bool True)
注意(作为n。1.8e9-where's-my-share m.在注释中指出)字符串必须加引号。
那么,您可以做的是获取未知值,并首先将其用引号括起来,然后尝试解析它。然后再试着不加引号地解析它。现在有两个Maybe Value
值。选择第一个Just
值(并准备处理Nothing
情况)。