We use the awesome Lift Json library in quite a few our projects. It allows for easy customization and is handy for writing and parsing JSON strings. One of the situations which could possibly push you against the wall is when you have classes extending traits. Let us look at this quick example trait Reducer case class SentimentReducer(name:String, coefficientLevel:Double) extends Reducer case class EmotionReducer(name:String, coefficientLevel:Double) extends Reducer case class Analysis(dataCubeName:String, reductionSteps:List[Reducer]) We have the situation like above where we have the Reducer trait. The Reducer can have multiple implementations as we have above. Finally, the Analysis class takes the data cube on which it has to work and a list of reductionSteps each one of which is individually a Reducer.