【问题标题】:creating json array in argonaut scala在 argonaut scala 中创建 json 数组
【发布时间】:2023-03-23 09:13:01
【问题描述】:

我对 scala 、游戏框架和 argonaut 还很陌生。 以下是我的案例类,其中包含 List[Remedy] 类型的变量 我的目标是生成一个包含 List[Remedy] 的 JsonArray 的 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)

关于运行的一切都很好,但是我应该怎么做才能将 JsonArray 添加到 prodiction Json 对象中

编辑 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

所以这是需要做的。 使用 constrcutor 中的所有参数创建案例类以及包含 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

【问题讨论】:

  • 我应该怎么做才能将 JsonArray 添加到 prodiction Json 对象中您想将 remedyList 添加到输出的 JSON 中?
  • @YuvalItzchakov 是的,这就是我要找的

标签: scala playframework


【解决方案1】:

当你有一个案例类时,它会容易得多,因为你可以使用casecodec

implicit def PredictionModel CodecJson: CodecJson[PredictionModel] =
    casecodec20(PredictionModel.apply, PredictionModel.unapply)("aboutKundali", "planetStatus", "donate", .....)

现在你有一个用于 PredictionModel 的 JSON 编解码器,它将从/到 json 对你的案例类进行编码和解码。

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

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

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)

这样做不仅是风格上的,而且还有技术原因(与如何为案例类生成 apply/unapply/equality 相关),因此最好遵循这种做法。

一般情况下,您应该遵循案例类是不可变的规则,并且所有值都声明为它们的构造函数参数。

一旦您为您的案例类声明了编解码器,您就可以“免费”获得列表的编解码器,因为 Argonaut 可以对 List[A] 进行编码,前提是它可以看到它可以对 A 进行编码,因此您无需执行任何操作这里特别。

【讨论】:

  • 几个问题 1) 我需要重载/覆盖应用和取消应用方法吗?在案例类的后续对象中,我在哪里隐式声明编解码器? import argonaut._, Argonaut._ case class TestModel(id: Int, name: String) { } object TestModel{ 隐式 def PredictionModelCodecJson = CodecJson[TestModel] = casecodec20(TestModel.apply, TestModel.unapply)("") }
  • 您不需要覆盖应用/取消应用。 Scala 编译器自动为案例类生成它们。您可以在伴生对象中声明隐式编解码器,是的,这将是最简单的。或者您可以在其他对象中执行此操作,但您需要导入它:import myCodecsPackage._.
  • 您的代码有问题,因为您使用了casecodec20。该数量应与构造函数参数的数量相对应。你的PredictionModel有20个参数,所以你必须使用casecodec20,你的TestModel只有2个,所以改用casecodec2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多