Это реализация JSON указателя (RFC 6901) на языке Scala, которая расширяет синтаксис JSON указателя (добавляет три ключевых слова :
, ,
, *
). Эта библиотека поддерживает два способа доступа к данным в формате JSON: парсер путей строк и DSL на Scala.
Вот список поддерживаемых операторов:
Оператор | Описание | Пример |
---|---|---|
/ |
разделение пути | /foo |
: |
срез массива (похожий на Python) |
/–1:–3 (последние 3 элемента) |
, |
коллекция имен или индексов |
/foo,bar или /foo/1,–1,2
|
* |
маска | /store/book/* |
Пример кода:
val json =
"""
|[
| [
| true,
| false,
| null
| ],
| {
| "abc": 1.233e-10,
| "bcd": true,
| "b": null
| },
| {
| "": 1.233e-10,
| "bcd": true,
| "b": 1.23
| },
| false,
| null
|]
""".stripMargin
val value6 = JSONPointer().read[List[Any]]("/*/*", json, List(None, Some((e: String) => e.contains("b"))))
assert(value6 === Some(List(List(1.233E-10, true, null), List(true, 1.23))))
``````scala
val значение7 = JSONPointer().read[Any]("/–3/1", json)
assert(значение7 === None)
val json =
"""
|[
| [
| true,
| false,
| null
| ],
| {
| "abc": 1.233e-10,
| "bcd": true,
| "b": null
| },
| {
| "": 1.233e-10,
| "bcd": true,
| "b": 1.23
| },
| false,
| null
|]
""".stripMargin
Пример кода:
val значение0 = JSONPointer().read[List[Any]](new Path / -3 / ("bcd", ""), json)
assert(значение0 === Some(List(true, 1.233E-10)))
val значение1 = JSONPointer().read[List[Any]](new Path / * / (*, (e: String) => e.contains("b")), json)
assert(значение1 === Some(List(List(1.233E-10, true, null), List(true, 1.23))))
val значение2 = JSONPointer().read[Any](new Path / (1 -> -1) / (*, (_: String) == "b"), json)
assert(значение2 === Some(List(null, 1.23)))
val значение3 = JSONPointer().read[Boolean](new Path / -3 / "bcd", json)
assert(значение3 === Some(true))
val значение4 = JSONPointer().read[List[Any]](new Path / (*, _ < _ -1), json)
assert(значение4 === Some(List(JSONArray(List(true, false, null)), JSONObject(Map("abc" -> 1.233E-10, "bcd" -> true, "b" -> null)), JSONObject(Map("" -> 1.233E-10, "bcd" -> true, "b" -> 1.23)), false)))
Символ | Экранирование | Пример |
---|---|---|
~ |
~0 (совместимость RFC6901) |
/~ =>/~0
|
/ |
~1 (совместимость RFC6901) |
/a/b =>/a~1b
|
, |
~, |
/foo,bar =>/foo~,bar
|
* |
~* |
/store/* =>/store/~*
|
```Вы можете использовать эти правила для экранирования символов вручную. Либо вы можете использовать вспомогательный метод quote
для выполнения этих действий.
Например:
import Path._
val путь = s"/*/${quote("*")}/${quote("abc,bcd")}"
Параметр путь
скомпилируется в строку /*/~*/abc~,bcd
.
Когда вы используете Scala DSL
, вам не требуется экранировать какие-либо символы.
Например:
val путь = new Path / * / "*" / "abc,bcd"
Параметр путь
скомпилируется в строку /*/~*/abc~,bcd
Фильтры могут использоваться только с *
.
Как вы видите выше, мы предоставляем три фильтра: два используются для JSONArray
, а третий — для JSONObject
.
JSONArray
: Int => Boolean
и (Int, Int) => Boolean
JSONObject
: String => Boolean
Int => Boolean
: Int
представляет собой индекс массива JSONArray
. Если результат равен true
, этот индекс массива JSONArray
будет возвращён.
(Int, Int) => Boolean
: Первый Int
представляет собой индекс массива JSONArray
, а второй Int
— размер массива JSONArray
.
String => Boolean
: String
представляет собой ключ объекта JSONObject
.
JSONPointer().read[List[Any]]("/*/*", json, List(None, Some((e: String) => e.contains("b"))))
Вы ДОЛЖНЫ добавить два фильтра к пути выше, так как этот путь содержит две звездочки (*
).
Первый фильтр — это None
, что представляет собой фильтр всего содержимого.
Второй фильтр — это Some((e: String) => e.contains("b"))
, что представляет собой фильтр ключей, содержащих строку "b"
.
new Path / * / (*, (e: String) => e.contains("b"))
Фильтр на первое *
добавлять не нужно, так как по умолчанию используется фильтр None
.
{
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive": 10
}
``` * /store/book/0/author
=> `"Нигель Рис"`
/store/book/0,2/author
=> Список("Нигель Рис", "Герман МелVILLE")
/store/book/0:2/author
=> Список("Нигель Рис", "Эвелин Уош", "Герман МелVILLE")
/store/book/:2/author
=> Список("Нигель Рис", "Эвелин Уош", "Герман МелVILLE")
/store/book/-1:-3/author
=> Список("Дж. Р. Р. Толкин", "Герман МелVILLE", "Эвелин Уош")
/store/book/:-3/author
=> Список("Нигель Рис", "Эвелин Уош")
/store/book/:/author
=> Список("Нигель Рис", "Эвелин Уош", "Герман МелVILLE", "Дж. Р. Р. Толкин")
/store/book/0:-1/author
=> Список("Нигель Рис", "Эвелин Уош", "Герман МелVILLE", "Дж. Р. Р. Толкин")
/store/book/*/author
=> Список("Нигель Рис", "Эвелин Уош", "Герман МелVILLE", "Дж. Р. Р. Толкин")
/store/bicycle/color
=> "красный"
{
"foo": ["bar", "baz"],
"": 0,
"a/b": 1,
"c%d": 2,
"e^f": 3,
"g|h": 4,
"i\\j": 5,
"k\"l": 6,
" ": 7,
"m~n": 8,
"0,2": 9,
"0:2": 10,
"*": 11
}
RFC6901 | значение |
---|---|
/foo |
["bar", "baz"] |
/foo/0 |
"bar" |
/ |
0 |
/a~1b |
1 |
/c%d |
2 |
/e^f |
3 |
`/g | h` |
/i\\j |
5 |
/k\"l |
6 |
/ |
7 |
/m~0n |
8 |
/0,2 |
9 |
/0:2 |
10 |
/~* |
11 |
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )