Причина, по которой вы не можете получить декодирование для CustomObject
, заключается в члене labels: Object
.
В Circe все декодирование осуществляется статическими типами, и Circe не предоставляет кодеры или декодеры для таких типов, как Object
или Any
, которые не имеют полезной статической информации.
Если вы измените этот класс дел на что-то вроде следующего:
case class CustomObject(apiVersion: String, kind: String, metadata: Metadata, spec: Spec)
… и оставьте оставшуюся часть кода без изменений при импорте:
import io.circe.Decoder, io.circe.generic.semiauto.deriveDecoder
И определите ваш документ JSON как doc
(после добавления кавычки в строку "image": "gcr.io/ynli-k8s/spark:v2.4.0,
, чтобы сделать его действительным JSON), следующее должно работать нормально:
scala> io.circe.jawn.decode[CustomObject](doc)
res0: Either[io.circe.Error,CustomObject] = Right(CustomObject(sparkoperator.k8s.io/v1alpha1,SparkApplication,Metadata(2019-01-11T15:58:45Z,1,uid,268972,spark-example,default,/apis/sparkoperator.k8s.io/v1alpha1/namespaces/default/sparkapplications/spark-example),Spec(cluster,gcr.io/ynli-k8s/spark:v2.4.0,Always,http://localhost:8089/spark_k8s_airflow.jar,org.apache.spark.examples.SparkExample,Deps(),Driver(0.1,1000m,1024m,default,Labels(2.4.0)),Executor(1.0,1.0,1024m,Labels(2.4.0)),Subresources(Status()))))
Несмотря на то, что говорит один из других ответов, Circe может определенно получить кодировщики и декодеры для классов дел без членов - здесь определенно не проблема.
В качестве дополнительного примечания, я хотел бы иметь возможность получать сообщения об ошибках лучше, чем это:
Error: could not find Lazy implicit value of type io.circe.generic.decoding.DerivedDecoder[dataModel.CustomObject
Но, учитывая, что circe-generic должен использовать Lazy
Shapeless прямо сейчас, это лучшее, что мы можем получить. Вы можете попробовать circe-Derivation в качестве альтернативы в основном для полуавтоматического вывода Circe-generic, который имеет лучшие сообщения об ошибках (и некоторые другие преимущества), или вы можете использовать плагин компилятора, такой как splain , который специально разработан, чтобы выдавать лучшие сообщения об ошибках даже при наличии таких вещей, как shapeless.Lazy
.
В качестве заключительного замечания вы можете немного очистить ваши полуавтоматические определения, позволив выводить параметр типа для deriveDecoder
:
implicit val customObjectLabelsDecoder: Decoder[Labels] = deriveDecoder
Это дело вкуса, но я считаю, что читать его немного менее шумно.