#json #pointers #json-path #serde-json #path #permissive

permissive-json-pointer

宽容的 JSON 指针

4 个版本

0.2.0 2022年4月6日
0.1.2 2022年4月1日
0.1.1 2022年4月1日
0.1.0 2022年4月1日

#30 in #json-path

WTFPL 许可证

26KB
636 代码行

宽容的 JSON 指针

本软件包提供了一种类似于“JSON 指针”的接口。但实际上它执行的操作相当不同。

API

该软件包提供了一个名为 select_values 的函数。它接收一个对象和一组选择器作为参数。然后它返回一个只包含您选择字段的新对象。

选择器

选择器的语法比其他 API 更简单。只有一个特殊符号,就是 .

如果您编写 dog 并提供以下对象;

{
  "dog": "bob",
  "cat": "michel"
}

您将得到以下结果;

{
  "dog": "bob",
}

很简单,对吧?

现在点号可以用作字段名,也可以用作嵌套对象。

例如,如果您有以下 JSON;

{
  "dog.name": "jean",
  "dog": {
    "name": "bob",
    "age": 6
  }
}

多么糟糕的 JSON!但永远不要低估您的用户,他们 一定会 以某种方式将整个工作流程建立在这种 JSON 之上。在这里,使用 dog.name 选择器将选择所有字段,并返回以下 JSON;

{
  "dog.name": "jean",
  "dog": {
    "name": "bob",
  }
}

正如您所猜测的,这个软件包尽可能地宽容。它会匹配它能匹配的任何东西!考虑以下更糟糕的 JSON;

{
  "pet.dog.name": "jean",
  "pet.dog": {
    "name": "bob"
  },
  "pet": {
    "dog.name": "michel"
  },
  "pet": {
    "dog": {
      "name": "milan"
    }
  }
}

如果您编写 pet.dog.name 将选择所有内容。

匹配数组

使用这种选择器,您不能匹配数组中的特定元素。您的选择器将应用于数组中的所有元素。

考虑以下 JSON;

{
  "pets": [
    {
      "animal": "dog",
      "race": "bernese mountain",
    },
    {
      "animal": "dog",
      "race": "golden retriever",
    },
    {
      "animal": "cat",
      "age": 8,
    }
  ]
}

使用过滤器 pets.animal 您将得到;

{
  "pets": [
    {
      "animal": "dog",
    },
    {
      "animal": "dog",
    },
    {
      "animal": "cat",
    }
  ]
}

数组中的空元素会被移除。因此,如果您要查找 pets.age,您将只会得到;

{
  "pets": [
    {
      "age": 8,
    }
  ]
}

我想这就是您需要知道的一切 🎉

依赖项

~0.5–1MB
~20K SLoC