> ## Documentation Index
> Fetch the complete documentation index at: https://cndoc-langchain.site/llms.txt
> Use this file to discover all available pages before exploring further.

# 分割JSON数据 - 文本分割器集成

> 使用LangChain Python集成分割JSON数据文本分割器。

此JSON分割器在[分割](/oss/python/integrations/splitters/)JSON数据的同时，允许控制块大小。它深度优先遍历JSON数据并构建较小的JSON块。它会尝试保持嵌套的JSON对象完整，但如有必要，会将其分割以保持块大小介于`min_chunk_size`和`max_chunk_size`之间。

如果值不是嵌套的JSON，而是一个非常大的字符串，则该字符串不会被分割。如果您需要对块大小有硬性限制，可以考虑将此分割器与递归文本分割器组合使用。有一个可选的预处理步骤来分割列表，方法是先将其转换为JSON（字典），然后按此方式分割。

1. 文本如何分割：按JSON值。
2. 块大小如何衡量：按字符数。

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
pip install -qU langchain-text-splitters
```

首先，我们加载一些JSON数据：

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
import json

import requests

# 这是一个大型嵌套JSON对象，将作为Python字典加载
json_data = requests.get("https://api.smith.langchain.com/openapi.json").json()
```

## 基本用法

指定 `max_chunk_size` 以约束块大小：

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
from langchain_text_splitters import RecursiveJsonSplitter

splitter = RecursiveJsonSplitter(max_chunk_size=300)
```

要获取JSON块，请使用 `.split_json` 方法：

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
# 递归分割JSON数据 - 如果您需要访问/操作较小的JSON块
json_chunks = splitter.split_json(json_data=json_data)

for chunk in json_chunks[:3]:
    print(chunk)
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
{'openapi': '3.1.0', 'info': {'title': 'LangSmith', 'version': '0.1.0'}, 'servers': [{'url': 'https://api.smith.langchain.com', 'description': 'LangSmith API endpoint.'}]}
{'paths': {'/api/v1/sessions/{session_id}': {'get': {'tags': ['tracer-sessions'], 'summary': 'Read Tracer Session', 'description': 'Get a specific session.', 'operationId': 'read_tracer_session_api_v1_sessions__session_id__get'}}}}
{'paths': {'/api/v1/sessions/{session_id}': {'get': {'security': [{'API Key': []}, {'Tenant ID': []}, {'Bearer Auth': []}]}}}}
```

要获取LangChain [Document](https://reference.langchain.com/python/langchain-core/documents/base/Document) 对象，请使用 `.create_documents` 方法：

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
# 分割器也可以输出文档
docs = splitter.create_documents(texts=[json_data])

for doc in docs[:3]:
    print(doc)
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
page_content='{"openapi": "3.1.0", "info": {"title": "LangSmith", "version": "0.1.0"}, "servers": [{"url": "https://api.smith.langchain.com", "description": "LangSmith API endpoint."}]}'
page_content='{"paths": {"/api/v1/sessions/{session_id}": {"get": {"tags": ["tracer-sessions"], "summary": "Read Tracer Session", "description": "Get a specific session.", "operationId": "read_tracer_session_api_v1_sessions__session_id__get"}}}}'
page_content='{"paths": {"/api/v1/sessions/{session_id}": {"get": {"security": [{"API Key": []}, {"Tenant ID": []}, {"Bearer Auth": []}]}}}}'
```

或者使用 `.split_text` 直接获取字符串内容：

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
texts = splitter.split_text(json_data=json_data)

print(texts[0])
print(texts[1])
```

```json theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
{"openapi": "3.1.0", "info": {"title": "LangSmith", "version": "0.1.0"}, "servers": [{"url": "https://api.smith.langchain.com", "description": "LangSmith API endpoint."}]}
{"paths": {"/api/v1/sessions/{session_id}": {"get": {"tags": ["tracer-sessions"], "summary": "Read Tracer Session", "description": "Get a specific session.", "operationId": "read_tracer_session_api_v1_sessions__session_id__get"}}}}
```

## 如何管理来自列表内容的块大小

请注意，此示例中的一个块大于指定的 `max_chunk_size`（300）。查看其中一个较大的块，我们发现其中有一个列表对象：

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
print([len(text) for text in texts][:10])
print()
print(texts[3])
```

```json theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
[171, 231, 126, 469, 210, 213, 237, 271, 191, 232]

{"paths": {"/api/v1/sessions/{session_id}": {"get": {"parameters": [{"name": "session_id", "in": "path", "required": true, "schema": {"type": "string", "format": "uuid", "title": "Session Id"}}, {"name": "include_stats", "in": "query", "required": false, "schema": {"type": "boolean", "default": false, "title": "Include Stats"}}, {"name": "accept", "in": "header", "required": false, "schema": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Accept"}}]}}}}
```

JSON分割器默认不分割列表。

指定 `convert_lists=True` 以预处理JSON，将列表内容转换为字典，其中 `index:item` 作为 `key:val` 对：

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
texts = splitter.split_text(json_data=json_data, convert_lists=True)
```

让我们看看块的大小。现在它们都在最大值以下了

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
print([len(text) for text in texts][:10])
```

```text theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
[176, 236, 141, 203, 212, 221, 210, 213, 242, 291]
```

列表已被转换为字典，但即使被分割成多个块，也保留了所有需要的上下文信息：

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
print(texts[1])
```

```json theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
{"paths": {"/api/v1/sessions/{session_id}": {"get": {"tags": {"0": "tracer-sessions"}, "summary": "Read Tracer Session", "description": "Get a specific session.", "operationId": "read_tracer_session_api_v1_sessions__session_id__get"}}}}
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
# 我们也可以查看文档
docs[1]
```

```python theme={"theme":{"light":"catppuccin-latte","dark":"catppuccin-mocha"}}
Document(page_content='{"paths": {"/api/v1/sessions/{session_id}": {"get": {"tags": ["tracer-sessions"], "summary": "Read Tracer Session", "description": "Get a specific session.", "operationId": "read_tracer_session_api_v1_sessions__session_id__get"}}}}')
```

***

<div className="source-links">
  <Callout icon="terminal-2">
    [连接这些文档](/use-these-docs)到Claude、VSCode等，通过MCP获取实时答案。
  </Callout>

  <Callout icon="edit">
    [在GitHub上编辑此页面](https://github.com/langchain-ai/docs/edit/main/src/oss/python/integrations/splitters/recursive_json_splitter.mdx)或[提交问题](https://github.com/langchain-ai/docs/issues/new/choose)。
  </Callout>
</div>
