/ / Como usar camelizeKeys com hífens - json, scala, json4s

Como usar camelizeKeys com hífens - json, scala, json4s

Estou analisando uma resposta json de um serviço da webque tem alguns campos definidos usando hífens. Eu quero converter esses nomes para nomes de casos mistos na minha classe de caso de scala. Eu pensei em usar a estipulação camelizeKeys, mas não parece funcionar. Por exemplo, digamos que eu tenho uma resposta json como:

{"offset":0,"total":359,"per-page":20}

para ser convertido em:

case class Response(offset: Int, total: Int, perPage: Int)

e eu faço:

parse(str).camelizeKeys.extract[Response]

Eu recebo o erro:

Ex: org.json4s.package $ MappingException: nenhum valor utilizável para perPage Não encontrou valor que pode ser convertido em int

Respostas:

0 para resposta № 1

Uma solução é substituir todas as ocorrências do hífen por um sublinhado antes de analisar o texto. Então, pode-se fazer o seguinte:

parse(str.replaceAll("([a-z])-([a-z])", "$1_$2")).camelizeKeys.extract[Response]

Mas esta solução é limitada como com complicadaestruturas de dados pode não funcionar; você pode acabar corrompendo os dados retornados se algum valor de campo contiver tal padrão. Então, uma solução mais completa foi escrever minha própria função replaceAll:

def replaceAll(str: String, regex: String)(f: String => String) = {
val pattern = regex.r
val (s, i) = (("", 0) /: pattern.findAllMatchIn(str)) { case ((s, i), m) =>
(s + str.substring(i, m.start) + f(m.toString), m.end)
}
s + str.substring(i)
}

e aplicá-lo à minha string json assim:

replaceAll(str, ""[0-9a-z\-]*":")(_.replace("-", "_"))