首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在argonaut scala中创建json数组

在argonaut scala中创建json数组
EN

Stack Overflow用户
提问于 2016-01-25 09:15:36
回答 1查看 404关注 0票数 1

我对scala、play framework和argonaut相当陌生。下面是我的case类,它包含一个类型为ListRemedy的变量,我的目标是生成包含JsonArray of ListRemedy的PredictionModel对象的json响应。

代码语言:javascript
复制
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的隐式如下所示:

代码语言:javascript
复制
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是我的测试用例类

代码语言:javascript
复制
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类,如下所示

代码语言:javascript
复制
case class Remedy(no: Int, description: String) {

}

object Remedy{

  implicit def RemedyCodecJson: CodecJson[Remedy] =
    casecodec2(Remedy.apply, Remedy.unapply)("number", "description")
}

在我的例子中,我在模型中有更复杂的模型,所以我只是为所有人创建了隐式CodecJson。怎么用呢?

代码语言:javascript
复制
 remedy.asJson
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-25 09:57:33

当您有一个case类时,它要容易得多,因为您可以使用casecodec

代码语言:javascript
复制
implicit def PredictionModel CodecJson: CodecJson[PredictionModel] =
    casecodec20(PredictionModel.apply, PredictionModel.unapply)("aboutKundali", "planetStatus", "donate", .....)

现在您已经为您的PredictionModel提供了一个json编解码器,它将您的case类从/解码到JSON。

为了使其工作,您可以将AboutKundliPlanetStatusRemedy定义为case类,并以类似的方式为它们创建casecodec

请注意,强烈建议以在构造函数中定义所有参数而不是在示例中显示的方式声明case类。更好的办法是:

代码语言:javascript
复制
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进行编码,那么您就不需要在这里做任何特别的事情了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34988813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档