2015-09-11 1 views
1

J'utilise Spray Json et je veux utiliser les valeurs par défaut définies dans les classes de cas, si une valeur est manquante dans le JSON qui peuple les objets.Comment utiliser les valeurs par défaut avec Spray Json?

Exemple

Disons que je veux créer un objet à partir de la classe de cas Person mais en utilisant un document JSON sans age de le faire:

case class Person(name: String, city: String, age: Int = -1) 

{"name": "john", "city": "Somecity"} 

Comment puis-je utiliser la valeur par défaut avec Spray Json?

+0

http://stackoverflow.com/questions/15740925/what-is-a-good-way-to-handle-default-values-with-spray-json –

+2

Ceci fait référence à une [demande de traction de deux ans] (https://github.com/spray/spray-json/pull/56), qui à son tour fait référence à [# 93] (https://github.com/spray/spray-json/pull/93) (status : ouvert) Il semble que spray json dort :-( – deamon

Répondre

1

La seule façon dont je sais comment faire ceci est d'utiliser Option[T] comme type de champ. Et, si le champ est facultatif, c'est la façon sémantiquement droit de le faire:

case class Person(name: String, city: String, age: Option[Int]) 

Lorsque l'âge n'est pas présent, l'âge sera Aucun. Depuis votre exemple, vous utilisez une valeur absurde (-1) comme un marqueur que l'âge est absent, l'aide d'un Option vous aidera beaucoup plus.

Mais, si vous avez vraiment besoin d'avoir une valeur par défaut, vous pouvez avoir une autre case class qui est rempli de celui que vous avez du JSON, en utilisant getOrElse ou utiliser getOrElse(defaultValue) dans votre code lorsque vous en avez besoin.

+0

L'exemple n'a pas beaucoup en commun avec mon code actuel où je n'utiliserais pas -1 comme marqueur, mais merci pour l'indice de toute façon ;-) – deamon

+0

J'utilise beaucoup de JSON -> Classe de cas. Ce que nous faisons habituellement est de créer une classe de cas intermédiaire qui obtient les valeurs de JSON, puis remplissons une autre classe de cas finale avec les valeurs par défaut. –

+0

Il serait bien que spray json reconnaisse les paramètres avec des valeurs par défaut comme optionnelles et prenne la valeur par défaut. Dans mon cas, 'case class Personne (nom: Chaîne, ville: Chaîne, age: Option [Int] = Some (25))' laisse toujours 'age' comme 'None'. –