Play framework (Scala) - Получение подмножества json, содержащего массивы

Функция order () не работает, когда столбец имеет уровни или коэффициент. Он работает правильно, когда stringsAsFactors = FALSE используется в создании data.frame.

2
задан tomaj 17 January 2019 в 12:32
поделиться

2 ответа

Пример возвращаемого элемента массива:

val input: JsValue = Json.parse("""
  {
    "arr1" : [{
      "field1" : "value1"
    }]
  }
  """)

val firstElement = (input \ "arr1" \ 0).get
val firstElementAnotherWay = input("arr1")(0) 

Подробнее об этом в документации Play Framework: https://www.playframework.com/documentation/2.6.x/ScalaJson [ 115]

Обновление

Похоже, у вас старая проблема RuntimeException: expected KeyPathNode. JsPath.json.put, JsPath.json.update не могут вставить объект в массив вложений.

https://github.com/playframework/playframework/issues/943

https://github.com/playframework/play-json/issues/82

Что вы можете сделать:

  1. Использовать JSZipper: https://github.com/mandubian/play-json-zipper [1110 ]
  2. Создание сценария для обновления массивов «вручную»
  3. Если вы можете себе это позволить, обрезать массив в результирующем объекте

Пример массива извлечения (точка 3): [ 1120]

def filterByPaths(paths: List[JsPath], inputObject: JsObject) : JsObject = {
  paths
    .map(_.json.pick)
    .map(inputObject.transform)
    .filter(_.isSuccess)
    .map { case JsSuccess(value, path) => (value, path)}
    .foldLeft(Json.obj()) { (obj, jsValueAndPath) =>
      val (jsValue, path) = jsValueAndPath
      val arrayStrippedPath = JsPath(path.path.filter(n => !(n.toJsonString matches """\[\d+\]""")))
      val transformer = __.json.update(arrayStrippedPath.json.put(jsValue))
      obj.transform(transformer).get
    }
}

val result = filterByPaths(List(JsPath \ "arr1" \ "0"), input)
// {"arr1":{"field1":"value1"}}

Пример

0
ответ дан Andriy Kuba 17 January 2019 в 12:32
поделиться
  1. Лучше всего обрабатывать объекты JSON с помощью классов дел и создавать неявные операции чтения и записи, благодаря которым вы можете обрабатывать ошибки в каждом поле напрямую. Не усложняй.

  2. Не используйте .get(), особенно рекомендуется использовать .getOrElse(), потому что scala - это безопасный для программирования язык программирования.

  3. Не просто используйте какие-либо библиотеки, за исключением того, что вы знаете процесс, стоящий за ним, гораздо лучше создать свой собственный метод анализа с упрощенным решением для экономии памяти.

Надеюсь, это поможет тебе.

0
ответ дан Rex 17 January 2019 в 12:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: