2015-10-23 5 views
1

Часто я нахожусь с JSON, что хочу разобрать строки где-то внутри, что я хочу анализировать нетривиальным способом (не только для String). В таком случае мне нужно сделать декодер или кодек для него, так что я мог бы попытаться сделать что-то вроде следующего:Как я должен обрабатывать отображение через DecodeResult?

CodecJson[URL](_.toString.asJson, h ⇒ 
    h.as[String].flatMap(s ⇒ Try{new URL(s)}.toOption) 
) 

, но это не будет компилироваться, потому что я не могу flatMap над один вариант.

Как должно обрабатываться это (казалось бы, общее) поведение?

Одним из вариантов было бы декодировать параметр [URL], но это похоже на облом, если вы просто хотите сменить декодирование.

Есть ли принятый способ решения этих последующих операций декодирования?

ответ

1

Чтобы решить проблему с планшетами, вы можете конвертировать из Try в DecodeResult. И следующий метод также обобщает String на X Codec.

def stringToTCodec[T](toString: T => String, fromString: String => T) = CodecJson[T](toString(_).asJson, h ⇒ 
h.as[String].flatMap(s ⇒ Try(fromString(s)) match { 
    case Success(u) => DecodeResult.ok(u) 
    case Failure(t) => DecodeResult.fail(s, h.history) 
})) 

implicit val urlCodec = stringToTCodec[URL](u => u.toString, s => new URL(s))