2014-01-25 4 views
7

die Aeson Mit deriveJSON es leicht Nichts Werte, z.B .:Wie leere Listen mit aeson deneJSON weglassen?

data Person = 
    Person { 
    ssn :: Maybe Text, 
    phone :: [Text] 
    } 

$(deriveJSON defaultOptions{omitNothingFields=True} ''Person) 

Ich mag würde auch weglassen leere Listen zu halten, um die JSON kompakt zu verzichten ist. Gibt es einen allgemeinen, leere Listen mit demeJSON wegzulassen, ohne Instanzen manuell zu verarbeiten?

+5

Sie könnten vielleicht den Typ in 'Maybe (NonEmptyList a)' ändern und ein entsprechendes To/FromJSON Setup dafür schreiben. Ich denke, es kodiert die Art von Informationen, die Sie vielleicht vermitteln möchten, deutlicher. –

Antwort

1

Ich glaube, dass Sie das derzeit nicht tun können.

Ich denke, es folgt der Philosophie, dass die Struktur des Objekts in etwa mit dem Typ übereinstimmen sollte; Von diesem Standpunkt aus ist {... phone: [] ...} oder sogar {... phone: null ...} für nicht existierende Felder "mehr typisiert", als sie aus dem Objekt herauszulassen.

Wenn Sie den JSON "kompakt" behalten möchten, ist das nicht für Eleganz, sondern z. Bandbreiten-Gründe, gzip oder Dinge wie JSONH können fast die gleichen Einsparungen transparent erreichen, ohne dass Sie die Struktur Ihrer Objekte ändern müssen.