APIJSON语法使用,超详细

APIJSON使用文档:http://apijson.cn/

APIJSON介绍:APIJSON赋予了前端极大的灵活性和自主性。根据业务需求前端可以自己设计数据库表结构,不再受限于后台接口,要啥有啥,所求即所得,大大提升了开发效率。

APIJSON 是一种专为 API 而生的 JSON 网络传输协议 以及 基于这套协议实现的 ORM 库。为各种增删改查提供了完全自动化的万能 API,零代码实时满足千变万化的各种新增和变更需求。能大幅降低开发和沟通成本,简化开发流程,缩短开发周期。

APIJSON - 功能符、数组关键词、对象关键词、全局关键词简表速查

一 功能符号

数据库表中的字段用key代替

[]:查询数组
"key[]":{}
{}:匹配选项范围
"key{}":[1,2,3]
{}:匹配条件范围
"key{}":"<=10;length(key)>1..."
<>:包含选项范围
"key<>":38710
}{@:判断是否存在
"key}{@":{}
():远程调用函数
"key()":"function(arg0,arg1...)"
@key():存储过程
"@key()":"function(arg0,arg1...)"
key@:引用赋值
"key@":"key0/key1.../targetKey"
key@:子查询
"key@":{
   "range":"ALL",
   "from":"Table",
   "Table":{ ... }
}
$:模糊搜索
"key$":"%abc%"
~:正则匹配
"key~":"^[0-9]+$"
%:连续范围
"key%":"2018-01-01,2018-10-01"
+:增加/扩展
"key+":[1]
-:减少/去除
"key-":888.88
>:比较运算
"key{}":"<=90000"
  • “>” 大于
  • “<” 小于
  • “>=” 大于等于
  • “<=” 小于等于
&:逻辑运算符
"key&{}":">80000,<=90000" // &, |, !
  • “&” 与(并且)
  • “|” 或(或者)
  • “!” 非(不等于)
新建别名
"key:alias"

二 数组关键词

“key”:Object,key为 “[]”:{} 中{}内的关键词,Object的类型由key指定 可以理解为下面这种格式

"[]":{
   "User":{},
   "query":2,
   "count":1,
   ......
},
查询数量
"count":1
查询页码
"page":1
查询内容
"query":Integer
  • 0 对象
  • 1 总数和分页详情
  • 2 数据、总数和分页详情
关联
"join":"&/Table0,</Table1/key1@"
  • “@” APP JOIN
  • “<” LEFT JOIN
  • “>” RIGHT JOIN
  • “&” INNER JOIN
  • “|” FULL JOIN
  • “!” OUTER JOIN
  • “*” CROSS JOIN
  • “^” SIDE JOIN
  • “(” ANTI JOIN
  • “)” FOREIGN JOIN
自定义关键词
"otherKey":Object

三 对象关键词

“@key”:Object,@key为 Table:{} 中{}内的关键词,Object的类型由@key指定 下面这种格式

"Table": {
   "@column":"key,key1",
}
条件组合
"@combine":"key0 | (key1 & (key2 | !key3))..."
返回字段
"@column":"column;function(arg)..."
排序方式
"@order":"column0+,column1-..."
分组方式
"@group":"column0,column1..."
聚合条件HAVING
"@having":"function0(...)?value0;function1(...)?value1;function2(...)?value2..."
集合空间
"@schema":"sys"
数据库类型
"@database":"POSTGRESQL"
跨数据源
"@datasource":"DRUID"
转为 JSON 格式返回
"@json":"key0,key1..."
来访角色
"@role":"OWNER"
性能分析
"@explain":true
自定义原始SQL片段
"@raw":"key0,key1..."
自定义关键词
"@otherKey":Object

四 全局关键词

为最外层对象 {} 内的关键词。

集合空间
"@schema":"sys"
跨数据源
"@datasource":"DRUID"
来访角色
"@role":"OWNER"
性能分析
"@explain":true
参数校验
"tag":String
接口版本
"version":Integer
格式化
"format":Boolean

APIJSON的简单查询

用user表作为示例

1、查询数组

查询列表,返回三条

“count”:查询数量

“page”:查询页码,从0开始

2、连续范围

查询2017-10-01到2018-10-01的数据

如果想查询<2017-10-01的数据,可以用下面的方式,同样的 <= , >=, > 也通用适用。

3、匹配条件范围

查询id<=80000|(或)id>90000的数据

4、包含选项范围

查询contactIdList包含38710的一个User数组

5、远程调用函数

这个在项目上有用到,还在深入研究中。可以理解为你把参数和方法名传递给后端,后端处理业务逻辑。

6、引用赋值

User内的id引用了与User同级的Moment内的userId, 即User.id = Moment.userId,请求完成后 “id@”:“/Moment/userId” 会变成 “id”:38710

7、模糊搜索

模糊搜索在项目上用到的很多,下面的列子对应 SQL name LIKE ‘%m%’

其他模糊查询方式:

8、正则匹配

如果其他查询不满足需求,可以自定义正则查询,下面例子对应SQL name REGEXP ‘1+$’

9、新建别名

很好理解,库字段 toId 返回前端时变为 parentId

10、逻辑运算 - &

查询id>80000 &(并且)id<=90000的数据

11、逻辑运算 - |

查询id>90000 | (或)id<=80000的数据

12、逻辑运算 - !

查询即 id满足 ! (id=82001 | id=38710)的数据

上面对查询操作做了示例,接下来就是增删改的使用

13、增加 - POST

14、修改 PUT

15、删除 - EDLETE

APIJSON 的复杂查询是如何实现的。

在演示查询之前我们先建几个表,Test_user、Test_user_moent_ref(关联表)、Test_moment,关联关系如图

随便添加几条数据,必须保证关联关系是正确的。

我们先用 SQL 查询,查询结果如下

一、单表查询 - 单条数据

1、单条数据

单表查询返回一条数据,用 Test_user 做示例,请求格式如下,

{
   "Test_user": {}
}

APIJSON 会转换为

SELECT * FROM test_user LIMIT 1 OFFSET

返回格式如下

2、 过滤数据

也可以过滤,比如 id=2 的数据

{
    "Test_user": {
        "id":"2"
    }
}

3、判断是否存在

{
    "Test_user": {
        "id}{@": {
            "from": "Test_user_moent_ref",
            "Test_user_moent_ref": {
                "id": 1
            }
        }
    }
}

}{ 表示 EXISTS,@ 后面是 子查询 对象,from 为目标表 Table 的名称;

二、单表查询 - 多条数据

1、多条数据

单表查询返回多条数据,用 Test_user 做示例,请求格式如下,

{
   "[]":{
    "Test_user": {}
   }
}

返回结果

2、分页查询

{
   "[]": {
      "count": 10,
      "page": 0,
      "Test_user": {
         "second_name": "唐三"
      }
   }
}

查询结果

3、 过滤字段

{
   "[]":{
    "Test_user": {
       "second_name":"唐三"
    }
   }
}

过滤second_name=唐三的数据

4、 模糊查询

{
   "[]": {
      "count": 10,
      "page": 0,
      "Test_user": {
         "second_name$": "唐%"
      }
   }
}

%表示任意字符,上面搜索是以开始,可以是任意SQL搜索表达式字符串,如 %key%(包含key), key%(以key开始), %k%e%y%(包含字母k,e,y) 等。

5、 正则表达式

{
   "[]": {
      "count": 10,
      "page": 0,
      "Test_user": {
         "second_name~": "\u5510"
      }
   }
}

正则也很简单,就是把汉字唐转化ASCII码,搜索包含唐的数据

6、 连续范围

{
   "[]": {
      "count": 10,
      "page": 0,
      "Test_user": {
         "id%": "1,9"
      }
   }
}

可以查询范围内的,由于我这边数据比较少,所以用 id

7、 控制返回字段

{
   "[]": {
      "count": 10,
      "page": 0,
      "Test_user": {
         "@column":"second_name",
         "id%": "1,9"
      }
   }
}

只返回second_name字段

8、 给返回字段设置别名

{
   "[]": {
      "count": 10,
      "page": 0,
      "Test_user": {
         "@column":"second_name:s_name",
         "id%": "1,9"
      }
   }
}

second_name设置别名为s_name

9、 比较运算

{
   "[]": {
      "count": 10,
      "page": 0,
      "Test_user": {
         "id>": "1"
      }
   }
}

比较运算符>, <, >=, <=都支持,不支持key=和key!=这两种,而是使用更为简单的 “key”:Object 和 “key!”:Object 替代。

10、逻辑运算

{
   "[]": {
      "count": 10,
      "page": 0,
      "Test_user": {
         "id&{}": ">1,<3"
      }
   }
}

逻辑运算符&, |, !都支持,但是使用场景不同

  • & 可用于"key&{}":"条件"等
  • | 可用于"key|{}":“条件”, “key|{}”:[]等,一般可省略
  • ! 可单独使用,如"key!":Object,也可像&,|一样配合其他功能符使用

三、 两张表-一对一关联查询

用Test_user和Test_user_moent_ref做示例,通过Test_user的id字段和Test_user_moent_ref的entity_id字段关联

{
    "Test_user": {},
    "Test_user_moent_ref":{
        "entity_id@":"/Test_user/id"
    }
}

返回两个表的所有字段

可以指定返回字段

四、 两张表-一对多关联查询

还是Test_user和Test_user_moent_ref做示例,通过Test_user的id字段和Test_user_moent_ref的entity_id字段关联

{
    "Test_user": {},
    "Test_user_moent_ref[]":{
        "Test_user_moent_ref":{
            "entity_id@":"Test_user/id"
        }
    }
}

返回数据如下

五、 两张表-数组内一对一关联查询

通过 Test_user 的 id 字段和 Test_user_moent_ref 的 entity_id 字段关联

{
    "[]":{
        "Test_user": {},
        "Test_user_moent_ref":{
            "entity_id@":"[]/Test_user/id"
        }
    }
}

其中

"entity_id@":"[]/Test_user/id

要根据 Test_user 在数组中的位置 index 来动态改变

请求返回格式

六、 两张表-数组内一对多关联查询

通过 Test_user 的 id 字段和 Test_user_moent_ref 的 entity_id 字段关联

{
    "[]":{
        "Test_user": {},
        "Test_user_moent_ref[]":{
        "Test_user_moent_ref":{
            "entity_id@":"[]/Test_user/id"
        }
        }
    }
}

注意事项和上面一样,返回格式如下

七、三张表及以上查询

通过 Test_user 的 id 字段和 Test_user_moent_ref 的 entity_id 字段关联,Test_user_moent_ref 的 component_id 字段和 Test_monent 的 id 字段关联,查询方式和上面大同小异。

{
    "[]": {
        "join": "</Test_user_moent_ref,</Test_monent",
        "Test_user": {
            "@column":"id,second_name"
        },
        "Test_user_moent_ref": {
            "entity_id@": "/Test_user/id"
        },
        "Test_monent":{
            "id@": "/Test_user_moent_ref/component_id"
        }
    }
}

数据是返回了,但是有点小问题

用 SQL 查询应该是这个样子的,但是返回的数据有点区别。


  1. 0-9 ↩︎

  • 41
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
JSON是一种轻量级的数据交换格式,全称为JavaScript Object Notation。它以易于阅读和编写的文本格式来表达数据对象,以键值对的形式表示数据,这使得它非常易于人们阅读和理解。JSON常用于Web应用程序间的数据传输,如客户端与服务器间的数据交换。它的语法JavaScript对象的语法类似,因此非常容易学习和实现。 在JSON中,数据以键值对的形式存在,以大括号作为容器。例如,以下是一个简单的JSON对象: { "name": "John", "age": 30, "city": "New York" } 该对象包含三个键值对,分别是name、age和city。name的值为John,age的值为30,city的值为New York。JSON对象中的值可以是字符串、数字、布尔型、对象、数组或null值。 对象中的每个键值对都用逗号分隔,并且键和值之间用冒号分隔。例如,在下面的JSON对象中,属性address的值是一个嵌套的对象: { "name": "Jane", "age": 25, "address": { "street": "123 Main St", "city": "San Francisco", "state": "CA" } } 此外,JSON还支持数组。数组是一系列有序的值,用方括号括起来,每个值之间用逗号分隔。例如: { "name": "Bob", "age": 40, "friends": ["Alice", "Charlie", "David"] } 在这个例子中,friends的值是一个字符串数组,其中包含三个元素:Alice、Charlie和David。 总而言之,JSON是一种非常方便、易于理解和使用的数据交换格式。虽然它不是一种可执行的编程语言,但它是一种在不同语言之间传输数据的标准方法。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

袁宇宙中有朵云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值