JSON кавычки делают парсинг невозможным - PullRequest
1 голос
/ 13 февраля 2020

Я использую библиотеки json для анализа json, отправленного мне javascript. Во время первоначального тестирования все работало нормально, но я обнаружил, что различные внешние интерфейсы отправляют json значения без кода или в кавычках. Время от времени это может меняться, так что мой анализ завершается неудачно, так как данные с плавающей запятой выглядят как строки, следующие.

Я использую неявные операции чтения для анализа модели и действительно хочу продолжать делать который. В настоящее время у меня есть:

case class dsource (
                     A: String,
                     B: Int,
                     C: Float,
                     D: Float,
                     E: Float,
                     F: Float,
                     G: Float
                   )

object dsource {
  implicit val dsourceaReads: Reads[dsource] = (
    (JsPath \ "A").read[String] and
      (JsPath \ "B").read[String].map(_.toInt) and
      (JsPath \ "C").read[String].map(_.toFloat) and
      (JsPath \ "D").read[String].map(_.toFloat) and
      (JsPath \ "E").read[Float] and
      (JsPath \ "F").read[Float] and
      (JsPath \ "G").read[Float]
  ) (dsource.apply _)
}}

Я хочу избежать предварительной обработки Json, и я не могу контролировать то, что отправляет мне внешний интерфейс, мне нужно обработать значение, заключено ли оно в кавычки или нет. Я предполагаю, что это проблема с тем, чтобы слабо типизированный интерфейс отправлял на строго типизированный сервер.

Есть предложения?

Заранее спасибо.

1 Ответ

1 голос
/ 13 февраля 2020

Вы можете создать помощников:

val maybeQuotedInt: Reads[Int] = Reads { 
  js => js.validate[String].map(_.toInt).orElse(js.validate[Int])
}
// similar for Float/Double/etc

и затем использовать их как

(JsPath \ "A").read[String] and
  (JsPath \ "B").read(maybeQuotedInt) and
  (JsPath \ "C").read(maybeQuotedFloat) and ...

Это не проверено, просто исходя из документации, поэтому могут потребоваться некоторые изменения, но этот подход должен работа.

...