[英]creating json array in argonaut scala
我对scala,游戏框架和argonaut相当陌生。 以下是我的案例类,其中包含类型为List [Remedy]的变量。我的目标是生成PredictionModel对象的json响应,该对象包含List [Remedy]的JsonArray。
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对象中添加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时,apply和unapply方法出错。 我需要超越他们吗? 还如何调用此隐式值?
编辑2
所以这是需要做的。 使用构造函数中的所有参数以及随后的包含CodecJson的对象类创建案例类,如下所示
case class Remedy(no: Int, description: String) {
}
object Remedy{
implicit def RemedyCodecJson: CodecJson[Remedy] =
casecodec2(Remedy.apply, Remedy.unapply)("number", "description")
}
就我而言,我在模型内部拥有更复杂的模型,因此我只为所有人创建了隐式CodecJson。 如何使用它 ?
remedy.asJson
当拥有一个case类时,它会容易得多,因为您可以使用casecodec
:
implicit def PredictionModel CodecJson: CodecJson[PredictionModel] =
casecodec20(PredictionModel.apply, PredictionModel.unapply)("aboutKundali", "planetStatus", "donate", .....)
现在,您的PredictionModel
具有JSON编解码器,它将对json中的case类进行编码和解码。
为了使其工作,您可以将AboutKundli
, PlanetStatus
和Remedy
定义为案例类,并以类似的方式为其创建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类是不可变的,并且所有值都声明为其构造函数参数。
在为案例类声明了编解码器之后,就可以“免费”使用列表的编解码器,因为Argonaut如果可以看到List[A]
可以对A
进行编码,就可以对其进行编码,因此您无需在此处进行任何特殊操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.