我对scala、play framework和argonaut相当陌生。下面是我的case类,它包含一个类型为ListRemedy的变量,我的目标是生成包含JsonArray of ListRemedy的PredictionModel对象的json响应。
package models
import scala.collection.mutable.ListBuffer
import argonaut._, Argonaut._
/**
* Created by abhishek on 15/01/16.
*/
case class PredictionModel() {
var aboutKundali: AboutKundli = new AboutKundli()
var planetStatus = new ListBuffer[PlanetStatus].toList
var donate = ""
var notToDonate = ""
var colorNotToWear = ""
var favouredGod = ""
var aboutEducationAndOccupation = ""
var mixMahaDashaCurrent = ""
var mixMahaDashaNotCurrent = ""
var category = ""
var rinnPitri = ""
var lifeHead = ""
var disease = ""
var occupation = ""
var marriedLife = ""
var santan = ""
var parents = ""
var nature = ""
var remedyList = new ListBuffer[Remedy].toList
var importantInformation = ""
}PredictionModel的隐式如下所示:
implicit def predicationEncodeJson: EncodeJson[PredictionModel] =
EncodeJson((prediction: PredictionModel) =>
("about_kundali" := argonaut.Json(
"birth_rashi" := prediction.aboutKundali.birthRashi,
"lagan_rashi" := prediction.aboutKundali.laganRashi,
"birth_day_planet" := prediction.aboutKundali.birthDayPlanet,
"birth_time_planet" := prediction.aboutKundali.birthTimePlanet,
"current_maha_dasha" := prediction.aboutKundali.currentMahaDasha,
"lucky_day" := prediction.aboutKundali.luckyDay,
"lucky_number" := prediction.aboutKundali.luckyNumber
)) ->:
("important_information" := prediction.importantInformation) ->:
("rinnPitri" := prediction.rinnPitri) ->:
("category" := prediction.category) ->:
("mix_mahadasha_not_current" := prediction.mixMahaDashaNotCurrent) ->:
("mix_mahadasha_current" := prediction.mixMahaDashaCurrent) ->:
("about_education_and_occupation" := prediction.aboutEducationAndOccupation) ->:
("favored_god" := prediction.favouredGod) ->:
("color_not_to_wear" := prediction.colorNotToWear) ->:
("donate" := prediction.donate) ->:
("not_to_donate" := prediction.notToDonate) ->: jEmptyObject)关于Json对象的所有内容都运行得很好,但是我应该做些什么来在prodiction对象中添加JsonArray呢?
这里建议的编辑1是我的测试用例类
import argonaut._, Argonaut._
case class TestModel(id: Int, name: String) {
}
object TestModel{
implicit def PredictionModelCodecJson = CodecJson[TestModel] =
casecodec20(TestModel.apply, TestModel.unapply)("id", "name")
}在声明casecodec20时,我在应用和不应用方法中出现了一个错误。我需要骑着他们吗?另外,如何调用这个隐式值?
编辑2
因此,我们需要做的是。使用constrcutor中的所有参数和包含CodecJson的后续对象类创建case类,如下所示
case class Remedy(no: Int, description: String) {
}
object Remedy{
implicit def RemedyCodecJson: CodecJson[Remedy] =
casecodec2(Remedy.apply, Remedy.unapply)("number", "description")
}在我的例子中,我在模型中有更复杂的模型,所以我只是为所有人创建了隐式CodecJson。怎么用呢?
remedy.asJson发布于 2016-01-25 09:57:33
当您有一个case类时,它要容易得多,因为您可以使用casecodec
implicit def PredictionModel CodecJson: CodecJson[PredictionModel] =
casecodec20(PredictionModel.apply, PredictionModel.unapply)("aboutKundali", "planetStatus", "donate", .....)现在您已经为您的PredictionModel提供了一个json编解码器,它将您的case类从/解码到JSON。
为了使其工作,您可以将AboutKundli、PlanetStatus和Remedy定义为case类,并以类似的方式为它们创建casecodec。
请注意,强烈建议以在构造函数中定义所有参数而不是在示例中显示的方式声明case类。更好的办法是:
case class PredictionModel(
aboutKundali: AboutKundli,
planetStatus: List[PlanetStatus],
donate: String,
notToDonate: String
colorNotToWear: String
favouredGod: String,
aboutEducationAndOccupation: String,
mixMahaDashaCurrent: String,
mixMahaDashaNotCurrent: String,
category: String,
rinnPitri: String,
lifeHead: String,
disease: String,
occupation: String,
marriedLife: String,
santan: String,
parents: String,
nature: String,
remedyList: List[Remedy],
importantInformation: String)它不仅是文体的,而且有技术上的原因(涉及如何为case类生成apply/unapply/相等),所以最好遵循这种做法。
通常,您应该遵循这样的规则: case类是不可变的,并且所有的值都被声明为它们的构造函数参数。
一旦您为您的case类声明了编解码器,您就有了列表的编解码器“免费”,因为Argonaut可以对List[A]进行编码,如果它可以对该A进行编码,那么您就不需要在这里做任何特别的事情了。
https://stackoverflow.com/questions/34988813
复制相似问题