> Source: https://ashareapi.com/wiki/response-shapes/  ·  Markdown version for LLMs / AI agents

参考

# 返回形态速查
 同样是 data，形态有四种：行数组、表列表、已排版文本、多段结构。取数前先判类型，否则会在"该按 data[0] 取"的地方去读字段，或者反过来。

## 四种形态

 `data` 不是一种东西。先看它是什么类型，再决定怎么取：

 
 | 

| 
 | 形态 
 | `data` 的类型 
 | 怎么取 




 

| 
 | **行数组** 
 | 数组，每项是一行 
 | `data[0].字段`；多行就是 `data[0]` → `data[n]` 



| 
 | **表列表** 
 | 数组的数组，每项是一张表 
 | `data[0]` 是第一张表，`data[0][0]` 是表里的第一行 



| 
 | **已排版文本** 
 | 字符串（markdown） 
 | 直接显示用 `data`；程序化取数用多出来的 `structured` / `tables` 



| 
 | **多段结构** 
 | 对象，含 `tables` 
 | 从 `data.tables` 按段取，每段有 `title` / `slug` / `rows` 






 一句话记法：**看第一个字符是 [ 、 { 还是 "**。


## 33 个端点分别属于哪一种

 
 | 

| 
 | 形态 
 | 端点 




 

| 
 | **行数组** 
 | `quote` · `kline` · `minute` · `hot` · `technical` · `chip` · `profile` · `search` · `ipo` · `dividend` · `block-trade` · `margin-trade` · `orderbook` · `snapshot` 



| 
 | **表列表** 
 | `finance` 



| 
 | **已排版文本** 
 | `market-overview` · `changedist` · `events` · `lhb` · `sector` · `sector-valuation` · `macro` · `bond` · `etf` · `dehydrated` · `screen` 



| 
 | **多段结构** 
 | `shareholder` · `calendar` 



| 
 | **对象（既不是数组也不是文本）** 
 | `fund` · `industry-chain` 



| 
 | **特例** 
 | `health`（无 `data`）· `usage`（纯文本，不是 JSON）· `challenge`（返回挑战本身） 







## 几个容易搞混的

 **orderbook 和 snapshot 也是行数组**，只是**恒定 1 行**。设计上统一成“行数组”是为了让客户端不必为单对象端点写特判 —— 你照 `data[0].字段` 取就对了。

 ⚠️ 上表是**单只代码**时的形态。**传多个代码时形态会变** —— `quote` / `technical` / `profile` 多出一列代码，`chip` 会变成**前缀列名的宽表**（行数不翻倍）。细节见[批量取数](/wiki/batch-fetch)。

 **finance 是表列表，不是多段结构**。`data[0]` / `data[1]` / `data[2]` 依次是利润表 / 资产负债表 / 现金流量表，**顺序固定**。想按名字取，见下节。

 **shareholder 和 calendar 是多段结构**，`data.tables` 是保序的表列表。⚠️ **shareholder 的段不能按序号取** —— A 股和港股的段数都是 3，但语义完全不同（A 股是十大股东 / 十大流通股东 / 股东户数；港股是持股股东 / 股东分布 / 机构持仓）。要按 `slug` 取。

 **fund 是真正对象**（不是文本）：`data.main_net`、`data.main_rank` 这类键直接取。


## 文本型端点怎么程序化取数

 文本型端点的 `data` 是给人看的 markdown，但**同时**多出两个字段：

 
 | 

| 
 | 字段 
 | 是什么 




 

| 
 | `structured` 
 | **第一张表**，`[{列名: 值}]` 



| 
 | `tables` 
 | **全部表**，`[[{列名: 值}], ...]` 






 `data` 本身**没有被改动** —— 文本客户端继续用 `data`，程序客户端用 `structured` / `tables`。多段输出（如 `calendar`、`macro`）用 `tables` 才拿得全。

 `structured` 只给第一张表，所以**只要一张表时用它最省事**（如 `screen` 的筛选结果）；**有多段时一定要用 tables**。


## 常见误用

 

- **把文本型当数组取** —— `market-overview`、`sector` 这类 `data` 是字符串，`data[0]` 拿到的是**第一个字符**，不是第一行。


- **把行数组当对象取** —— `quote` 的 `data` 是数组，直接读 `data.last` 取不到，要 `data[0].last`。


- **finance 按名字取** —— 它是**顺序固定的表列表**，没有 slug；按名字取会拿错表。


- **shareholder 按序号取段** —— A 股 / 港股段数相同但语义不同，必须按 `slug`。


- **忘了 structured 只含第一张表** —— 多段端点只读它会丢掉后面所有段。




 最后更新: 2026-10-07
 形态为 2026-10-07 逐个端点实测（数据层直调，逐端点打印返回类型与键名）；文本型端点额外多出的 structured / tables 取自服务端注入逻辑。

 接着看

-
[返回信封字段](/wiki/envelope)

-
[全部端点清单](/endpoints)

 [← 全部 Wiki](/wiki)
