Функция order () не работает, когда столбец имеет уровни или коэффициент. Он работает правильно, когда stringsAsFactors = FALSE используется в создании data.frame.
Пример возвращаемого элемента массива:
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
Что вы можете сделать:
Пример массива извлечения (точка 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"}}
Пример
Лучше всего обрабатывать объекты JSON с помощью классов дел и создавать неявные операции чтения и записи, благодаря которым вы можете обрабатывать ошибки в каждом поле напрямую. Не усложняй.
Не используйте .get()
, особенно рекомендуется использовать .getOrElse()
, потому что scala - это безопасный для программирования язык программирования.
Не просто используйте какие-либо библиотеки, за исключением того, что вы знаете процесс, стоящий за ним, гораздо лучше создать свой собственный метод анализа с упрощенным решением для экономии памяти.
Надеюсь, это поможет тебе.