首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >容错JSON解析

容错JSON解析
EN

Stack Overflow用户
提问于 2012-05-15 16:14:16
回答 1查看 1.2K关注 0票数 11

我使用Data.Aeson将一些JSON解析为记录类型。数据不时被添加到JSON中,这破坏了我的代码,因为伊索抱怨的结果是:

预期对象有21个名称/值对,但得到23个名称/值

我真的更愿意以一种容错的方式解析JSON --我不在乎以后是否会有更多的字段添加到JSON中,只需解析所有您能做的!有办法实现这种容错吗?这是我的密码:

代码语言:javascript
复制
myRecordFromJSONString :: BS.ByteString -> Maybe MyRecord
myRecordFromJSONString s = case Data.Attoparsec.parse json s of
  Done _rest res -> Data.Aeson.Types.parseMaybe parseJSON res
  _              -> Nothing

我应该补充一下,我正在使用来自deriveJSON的Data.Aeson.TH来生成解析代码。如果我手动编写FromJSON代码,它是容错的,但我不想那么做.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-15 20:59:15

如果使用GHC7.2或7.4,aeson中的新泛型支持不会检查额外的字段。我不确定这是故意的还是非故意的,但我们使用它的原因是相同的。

代码语言:javascript
复制
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}

import Data.Aeson
import qualified Data.Aeson.Types
import Data.Attoparsec
import qualified Data.ByteString as BS
import Data.ByteString.Char8 ()
import GHC.Generics

data MyRecord = MyRecord
  { field1 :: Int
  } deriving (Generic, Show)

instance FromJSON MyRecord

myRecordFromJSONString :: BS.ByteString -> Maybe MyRecord
myRecordFromJSONString s = case Data.Attoparsec.parse json s of
  Done _rest res -> Data.Aeson.Types.parseMaybe parseJSON res
  _              -> Nothing

main :: IO ()
main = do
  let parsed = myRecordFromJSONString "{ \"field1\": 1, \"field2\": 2 }"
  print parsed

由于记录中不存在“field2”,因此在TH派生实例中运行此操作将失败。Generic实例返回所需的结果:

代码语言:javascript
复制
Just (MyRecord {field1 = 1})
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10604808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档