使用Circe自定义编解码器将json解码为案例类列表

使用Circe自定义编解码器将json解码为案例类列表,json,scala,decode,circe,Json,Scala,Decode,Circe,我正在尝试使用Circe的自定义编解码器将json解码为一个特性列表,该特性被分解为两个案例类: 特征特征{ 定义名称:字符串 定义索引:Int 定义频率:Int } 案例类数字特征名称、索引、频率特征 案例类SetFeaturename、索引、集合、频率扩展功能 从这里显示的json: [ { "name" : "ElectionReturns_G16CountyTurnoutAllRegisteredVoters", "index" : 1770, "frequency"

我正在尝试使用Circe的自定义编解码器将json解码为一个特性列表,该特性被分解为两个案例类:

特征特征{ 定义名称:字符串 定义索引:Int 定义频率:Int } 案例类数字特征名称、索引、频率特征 案例类SetFeaturename、索引、集合、频率扩展功能 从这里显示的json:

[
 {
   "name" : "ElectionReturns_G16CountyTurnoutAllRegisteredVoters",
   "index" : 1770,
   "frequency" : 2992
 },
{
   "name" : "CommercialDataLL_Home_Owner_Or_Renter",
   "index" : 1112,
   "set" : [
     "Likely Homeowner",
     "",
     "Likely Renter",
    ],
   "frequency" : 2537
},
   .
   .
   .
   .
]
以下代码适用于案例类的单个实例:

{
   "name" : "ElectionReturns_G16CountyTurnoutAllRegisteredVoters",
   "index" : 1770,
   "frequency" : 2992
 }
导入io.circe.Json 导入io.circe_ 导入io.circe.parser_ 隐式val解码器:解码器[功能]=新解码器[功能]{ final def applyh:HCursor:Decoder.Result[Feature]=for{ name只要使用io.circe.parser.decode就可以了,因为您的范围内有解码器[功能]:

io.circe.parser.decode[Seq[Feature]](json)
您不必提供解码器[Seq[Feature].

只要使用io.circe.parser.decode即可,前提是您的范围内有解码器[Feature]:

io.circe.parser.decode[Seq[Feature]](json)

您不必提供解码器[Seq[Feature].

尝试使用自定义解码器。这种方法适合我:

import cats.Show
import cats.implicits._
import io.circe.Decoder

object Feature {
  implicit val featureDecoder: Decoder[Feature] = List[Decoder[Feature]](
    Decoder[NumericFeature].widen,
    Decoder[SetFeature].widen
  ).reduceLeft(_ or _)
}

尝试使用自定义解码器。这种方法适合我:

import cats.Show
import cats.implicits._
import io.circe.Decoder

object Feature {
  implicit val featureDecoder: Decoder[Feature] = List[Decoder[Feature]](
    Decoder[NumericFeature].widen,
    Decoder[SetFeature].widen
  ).reduceLeft(_ or _)
}

因此,您没有围绕JSON对象的包装[和]?如果您有解码器[功能],circe将自动提供解码器[列表[功能]]-这通常是Scala和其他语言中类型类的工作方式。@Travis Brown-我在测试时似乎不是这样,也许我使用它的方式是错误的?我使用decoder.decodeJsonparsejson.getOrElseJson.Null来解码我的json。@RileyWhite如果你提供了一个完整的示例,我将试着看一看。@TravisBrown当然,您还需要什么,这几乎是我使用的所有代码,谢谢。所以您没有围绕JSON对象的包装[和]?如果您有解码器[功能],circe将自动提供解码器[列表[功能]]-这通常是Scala和其他语言中类型类的工作方式。@Travis Brown-我在测试时似乎不是这样,也许我使用它的方式是错误的?我使用decoder.decodeJsonparsejson.getOrElseJson.Null来解码我的json。@RileyWhite如果你提供了一个完整的示例,我将试着看一看。@TravisBrown当然,你还需要什么,这几乎是我正在使用的所有代码,谢谢。很抱歉,我的JSON中确实有包装[],我已经更新了我的帖子。此外,我不能使用decode函数,因为我需要处理两种不同的情况。我编辑了我的答案,应该可以。确保不要定义任何解码器[Seq[Feature]],它们是由circe提供的。很抱歉,我的JSON中确实有包装[],我已经更新了我的帖子。此外,我不能使用解码功能,因为我需要处理两种不同的情况。我编辑了我的答案,应该可以。确保不要定义任何解码器[Seq[Feature]],他们是由circe提供的。有人在没有解释的情况下投票。这正是@Riley White要求的。他需要在一个解码器中处理两个不同的案例有人在没有解释的情况下投票。这正是@Riley White要求的。他需要在一个解码器中处理两个不同的案例