1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/leonchen83-jsonpath

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

jsonpath

Статус сборки Статус покрытия

Это реализация 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

DSL на Scala:

Пример кода:

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:

Когда вы используете 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".

Scala DSL:

new Path / * / (*, (e: String) => e.contains("b"))

Фильтр на первое * добавлять не нужно, так как по умолчанию используется фильтр None.

Примеры

Обычный:```json

{ "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 )

Вы можете оставить комментарий после Вход в систему

Введение

Реализация RFC6901 и поддержка Scala DSL. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/leonchen83-jsonpath.git
git@api.gitlife.ru:oschina-mirror/leonchen83-jsonpath.git
oschina-mirror
leonchen83-jsonpath
leonchen83-jsonpath
master