Конвертировать Json String в Json Array Circe Scala? - PullRequest
0 голосов
/ 28 февраля 2020

Итак, у меня есть здесь (обратите внимание, что это не является синтаксически правильным, я просто хочу показать вам идею)

js = “a1,a2”

как мне преобразовать строку Circe. JSON в Circe. JSON массив?

    

expected js => [“a1”,”a2”]



Цель состоит в том, чтобы функция возвращала [«a1», «a2»] как массив [байт]

1 Ответ

2 голосов
/ 28 февраля 2020

Поскольку это не очень типичный случай, circe не обеспечивает такого поведения "из коробки", поэтому вам потребуется реализовать собственные Encoder и Decoder. К счастью, это легко сделать с этой библиотекой.

Пожалуйста, посмотрите пример кода ниже:

import io.circe._
import io.circe.syntax._
import io.circe.generic.auto._

val separator = ","
// Implement own `Encoder` to render array of string as JSON string, separated with comma inside
implicit val encoder: Encoder[Array[String]] = Encoder[String].contramap(_.mkString(separator))

// Implement own `Decoder` to parse JSON string as array
implicit val decoder: Decoder[Array[String]] = Decoder[String].map(_.split(separator))

// Class added for sake of example, because I guess you will use string array as a part of another structure
case class Foo(a: Array[String]) {
  // override toString, because array toString works as default Object toString, which is not really readable
  // Made for example readability, you don't need to do in your code
  override def toString: String = s"Foo(a: ${a.mkString(", ")})"
}

val foo = Foo(Array("a1", "a2"))
val json = foo.asJson

println(json.noSpaces)
println(json.as[Foo])

, который дает следующий результат:

{"a":"a1,a2"}
Right(Foo(a: a1,a2))

Надеюсь, это помогает!

...