Ich habe eine ArtWeglassen Nichts/null Felder in Haskell Aeson
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiWayIf #-}
import GHC.Generics
import Data.Aeson.TH
import Data.Aeson.Types
data MyJSONObject = MyJSONObject
{ name :: String
, ptype :: Maybe String
, pid :: Maybe String
, subject :: Maybe String
, message :: Maybe String
} deriving (Show, Generic)
mit sehr vielen mehr Maybe String
Felder aus. Meine FromJSON
und ToJSON
durch die TemplateHaskell
Funktion zur Verfügung gestellt werden
$(deriveJSON defaultOptions
{
omitNothingFields = True
, fieldLabelModifier = \f -> if
| f == "ptype" -> "type" -- reserved keyword
| f == "pid" -> "id" -- Prelude function name
| otherwise -> f
} ''MyJSONObject)
Letztlich ist die Ausgabe des Programms ist ein JSON Dokument gedacht von einer Anwendung verbraucht werden, die Nullwerte nicht über einige Felder zulassen, auch wenn es tut erlauben Sie, dass diese Felder nicht existieren. Mit anderen Worten, es ist völlig in Ordnung, dass subject
im JSON-Dokument nicht vorhanden ist, aber wenn es existiert, kann sein Wert nicht null sein. Meine Erwartung war, dass omitNothingFields
würde diese Anforderung behandeln, aber dies scheint nicht der Fall zu sein: die decode
d JSON hat noch Nothing
Werte für Felder, die nicht vorhanden sind, und encode
d JSON hat null
Werte für diese Felder. Der erste Fall ist in Ordnung; Letzteres ist nicht die Frage.
Verwechsle ich oder missverstanden den Zweck von, omitNothingFields
? Wie kann ich Felder mit Nothing
/null
Werten ignorieren?
Funktioniert für mich. ('encode (MyJSONObject" foo "Nichts Nichts Nichts Nichts)' Gibt '" {\ "Name \": \ "foo \"} "'.) Welche Version von Aeson benutzt Du? –
@DanielWagner Ich benutze 'Aeson-1.1.2.0'. Mein Problem stellte sich heraus, dass ich 'FromJSON/ToJSON' nicht für' data MyOtherJSONObject = MyOtherJSONObject {objects :: [MyJSONObject]} abgeleitet habe (Show, Generic) '(das sind die Daten, die _really_' decode'/'encode' haben wollten) mit der Option 'omitNothingFields'. Warum ich es auch dort brauchte, ist mir ein Rätsel. Ich dachte, mein Problem beträfe die 'MyJSONObject'-Instanzen. – user4601931