代码之家  ›  专栏  ›  技术社区  ›  Nikita Volkov

使用“lens”向JSON对象添加新字段

  •  2
  • Nikita Volkov  · 技术社区  · 10 年前

    请考虑以下计划:

    import Control.Monad.Trans.State.Strict
    import Control.Lens
    import Data.Aeson.Lens
    import qualified Data.Aeson
    
    
    json :: Data.Aeson.Value
    json =
      maybe undefined id (Data.Aeson.decode "{\"a\":\"1\"}")
    
    addAField :: State Data.Aeson.Value ()
    addAField =
      assign (key "b" . _String) "2"
    
    main =
      print (execState addAField json)
    

    它会产生以下输出:

    Object (fromList [("a",String "1")])
    

    如何更新 addAField 函数使程序产生以下输出:

    Object (fromList [("a",String "1"), ("b",String "2")])
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Nikita Volkov    10 年前

    我能想到的最好办法是直接寻址JSON值:

    addAField :: State Data.Aeson.Value ()
    addAField =
      assign (_Object . at "b") (Just (Data.Aeson.String "2"))
    
    推荐文章