簡體   English   中英

在argonaut scala中創建json數組

[英]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類進行編碼和解碼。

為了使其工作,您可以將AboutKundliPlanetStatusRemedy定義為案例類,並以類似的方式為其創建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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM