JSON چیست؟ آموزش کامل JSON در Python، JavaScript و API هوش مصنوعی
در این آموزش با ساختار و Syntax زبان JSON آشنا میشوید، داده JSON را در Python و JavaScript میخوانید و میسازید و نحوه ارسال و دریافت JSON در APIهای هوش مصنوعی را با مثال واقعی یاد میگیرید.
JSON یکی از مهمترین فرمتهای تبادل داده در برنامهنویسی مدرن است. وقتی یک وبسایت اطلاعات کاربر را از Backend دریافت میکند، یک اپلیکیشن موبایل به سرور درخواست میفرستد یا برنامهای به API هوش مصنوعی متصل میشود، دادهها در بسیاری از موارد با فرمت JSON جابهجا میشوند.
اگر با Python، JavaScript، اپلیکیشن موبایل، REST API، Backend، پایگاه داده، هوش مصنوعی یا سرویسهای تحت وب کار میکنید، یادگیری JSON ضروری است.
در این آموزش از مفاهیم پایه شروع میکنیم و بهصورت عملی یاد میگیریم:
- JSON چیست و چه کاربردی دارد؟
- ساختار صحیح JSON چگونه نوشته میشود؟
- Object، Array، String، Number، Boolean و null چیست؟
- تفاوت JSON با JavaScript Object و Python Dictionary چیست؟
- Serialization و Deserialization چه معنایی دارند؟
- چگونه JSON را در Python بخوانیم و تولید کنیم؟
- چگونه از
JSON.parse()وJSON.stringify()در JavaScript استفاده کنیم؟ - چگونه فایل JSON بخوانیم و بنویسیم؟
- چگونه JSON را در HTTP API ارسال و دریافت کنیم؟
- پاسخ JSON یک API هوش مصنوعی را چگونه پردازش کنیم؟
- JSON Schema چه کاربردی دارد؟
- خطاهای رایج JSON چگونه پیدا و برطرف میشوند؟
در پایان نیز یک پروژه عملی میسازیم که با Python داده JSON را به API هوش مصنوعی درواره ارسال، پاسخ را بررسی و نتیجه را در فایل ذخیره میکند.
پاسخ کوتاه: JSON چیست؟
JSON مخفف عبارت زیر است:
JavaScript Object Notation
JSON یک فرمت متنی سبک برای نمایش و تبادل دادههای ساختاریافته است.
نمونه ساده:
{
"name": "Darvareh",
"type": "AI API Platform",
"active": true,
"model_count": 100,
"categories": [
"text",
"image",
"audio",
"video"
]
}
در این مثال اطلاعات یک سرویس بهصورت مجموعهای از کلیدها و مقدارها نمایش داده شده است.
اگرچه JSON از Syntax اشیای JavaScript الهام گرفته، به JavaScript محدود نیست. تقریباً تمام زبانهای برنامهنویسی مدرن میتوانند JSON را بخوانند و تولید کنند.
طبق وبسایت رسمی JSON، JSON یک فرمت سبک تبادل داده، خوانا برای انسان و قابل Parse و تولید برای ماشین است.
چرا JSON تا این اندازه پرکاربرد است؟
مهمترین دلایل محبوبیت JSON عبارتاند از:
- ساختار آن نسبتاً ساده و خوانا است.
- متنمحور است.
- به زبان برنامهنویسی خاصی وابسته نیست.
- بیشتر زبانها پشتیبانی داخلی یا کتابخانه استاندارد برای آن دارند.
- برای انتقال داده در HTTP API مناسب است.
- از Object و Arrayهای تودرتو پشتیبانی میکند.
- نسبت به بعضی فرمتهای قدیمی مانند XML کمحجمتر است.
- در Browser، Backend، موبایل و Cloud قابل استفاده است.
- بسیاری از تنظیمات نرمافزارها با فایل JSON نگهداری میشوند.
- بیشتر APIهای هوش مصنوعی درخواست و پاسخ JSON دارند.
JSON کجا استفاده میشود؟
JSON در بخشهای مختلف توسعه نرمافزار کاربرد دارد:
- ارتباط Frontend و Backend
- REST API
- APIهای هوش مصنوعی
- فایلهای تنظیمات
- ذخیره دادههای ساختاریافته
- اپلیکیشنهای موبایل
- Webhook
- Microserviceها
- Serverless Functionها
- پایگاههای داده Document
- Logهای ساختاریافته
- خروجی ابزارهای CLI
- تبادل داده بین زبانهای مختلف
- پیامهای Queue و Event
- تعریف Workflow
- فایلهای پروژه مانند
package.json - خروجی Structured Outputs مدلهای هوش مصنوعی
ساختار اصلی JSON
JSON بر دو ساختار اصلی بنا شده است:
- Object یا مجموعه کلید و مقدار
- Array یا فهرست مرتب مقادیر
یک Object با { شروع و با } تمام میشود:
{
"name": "Sara",
"age": 29
}
یک Array با [ شروع و با ] تمام میشود:
[
"Python",
"JavaScript",
"Go"
]
این ساختارها میتوانند داخل یکدیگر قرار بگیرند:
{
"user": {
"id": 125,
"name": "Sara"
},
"skills": [
"Python",
"Data Analysis"
]
}
انواع داده در JSON
JSON از انواع داده محدودی پشتیبانی میکند.
| نوع داده | نمونه |
|---|---|
| Object | {"name": "Ali"} |
| Array | ["Python", "Go"] |
| String | "Hello" |
| Number | 125 یا 19.75 |
| Boolean | true یا false |
| Null | null |
JSON نوع مستقلی برای Date، Time، Binary، Function، Class یا Undefined ندارد.
Object در JSON
Object مجموعهای از جفتهای Key و Value است:
{
"product_id": 1042,
"title": "AI API Credit",
"price": 500000,
"available": true
}
در JSON:
- Key باید داخل Double Quote نوشته شود.
- بعد از Key علامت
:قرار میگیرد. - جفتهای Key و Value با
,جدا میشوند. - بعد از آخرین مقدار نباید Comma قرار گیرد.
نمونه نامعتبر:
{
product_id: 1042,
"title": "AI API Credit",
}
دو مشکل دارد:
- کلید
product_idداخل Double Quote نیست. - بعد از آخرین Property کامای اضافه وجود دارد.
نسخه صحیح:
{
"product_id": 1042,
"title": "AI API Credit"
}
Array در JSON
Array فهرستی مرتب از مقادیر است:
{
"models": [
"model-a",
"model-b",
"model-c"
]
}
اعضای Array میتوانند از نوعهای مختلف باشند:
[
"text",
100,
true,
null,
{
"name": "example"
},
[
1,
2,
3
]
]
اگرچه این ساختار معتبر است، استفاده بیدلیل از نوعهای متفاوت در یک Array میتواند پردازش و Validation داده را دشوار کند.
برای دادههای قابل پیشبینی بهتر است اعضای یک Array ساختار مشابهی داشته باشند:
[
{
"id": 1,
"name": "Model A"
},
{
"id": 2,
"name": "Model B"
}
]
String در JSON
String باید داخل Double Quote قرار گیرد:
{
"message": "سلام دنیا"
}
استفاده از Single Quote معتبر نیست:
{
'message': 'سلام دنیا'
}
برای قراردادن Double Quote داخل String باید از Escape استفاده کنید:
{
"message": "او گفت: \"سلام\""
}
کاراکترهای Escape رایج:
| Escape | کاربرد |
|---|---|
\" | Double Quote |
\\ | Backslash |
\n | خط جدید |
\r | Carriage Return |
\t | Tab |
\uXXXX | کاراکتر Unicode |
نمونه:
{
"text": "خط اول\nخط دوم"
}
Number در JSON
JSON از عدد صحیح و اعشاری پشتیبانی میکند:
{
"users": 1250,
"temperature": 0.3,
"balance": -5000,
"small_value": 1.5e-6
}
مقادیر زیر در JSON استاندارد معتبر نیستند:
NaN
Infinity
-Infinity
0xFF
همچنین عدد نباید داخل Quote قرار گیرد، مگر اینکه عمداً بخواهید آن را بهصورت String نگه دارید.
عدد:
{
"price": 250000
}
رشته:
{
"price": "250000"
}
این دو مقدار از نظر نوع داده یکسان نیستند.
Boolean در JSON
مقادیر Boolean در JSON با حروف کوچک نوشته میشوند:
{
"active": true,
"deleted": false
}
نسخههای زیر نامعتبر هستند:
True
False
TRUE
FALSE
در Python از True و False استفاده میشود، اما هنگام تبدیل به JSON کتابخانه استاندارد آنها را به true و false تبدیل میکند.
null در JSON
null نشان میدهد مقدار وجود ندارد یا نامشخص است:
{
"name": "Ali",
"phone": null
}
وجود کلید با مقدار null با نبودن کلید تفاوت دارد.
نمونه اول:
{
"phone": null
}
نمونه دوم:
{}
در نمونه اول کلید phone وجود دارد، اما مقدار ندارد. در نمونه دوم کلید اصلاً ارسال نشده است. API باید معنای این دو وضعیت را مشخص کند.
آیا ریشه JSON حتماً باید Object باشد؟
خیر. ریشه یک سند JSON میتواند Object، Array یا حتی یک مقدار ساده باشد.
تمام نمونههای زیر JSON معتبر هستند:
{
"name": "Ali"
}
[
1,
2,
3
]
"hello"
125
true
null
بااینحال، بیشتر APIها در سطح ریشه از Object استفاده میکنند تا امکان افزودن فیلدهای جدید وجود داشته باشد.
JSON تودرتو
Object و Array میتوانند چند سطح داخل یکدیگر قرار گیرند:
{
"user": {
"id": 502,
"profile": {
"name": "Nima",
"languages": [
{
"name": "Python",
"level": "advanced"
},
{
"name": "JavaScript",
"level": "intermediate"
}
]
}
}
}
این ساختار معتبر است، اما تودرتویی بیشازحد خوانایی و نگهداری API را کاهش میدهد. ساختار داده را بر اساس نیاز واقعی طراحی کنید.
تفاوت JSON با JavaScript Object
این دو شبیهاند، اما یکسان نیستند.
JavaScript Object:
const user = {
name: "Sara",
age: 28,
active: true,
greet() {
return "Hello";
},
};
JSON:
{
"name": "Sara",
"age": 28,
"active": true
}
تفاوتها:
| ویژگی | JSON | JavaScript Object |
|---|---|---|
| ماهیت | متن | شیء داخل حافظه |
| Quote کلید | الزامی | همیشه الزامی نیست |
| String | فقط Double Quote | Single یا Double Quote |
| Function | پشتیبانی نمیشود | پشتیبانی میشود |
undefined | ندارد | دارد |
| Comment | ندارد | دارد |
| Trailing Comma | مجاز نیست | در بسیاری موارد مجاز است |
| Parse | لازم است | از قبل Object است |
عبارت زیر JavaScript معتبر است، اما JSON معتبر نیست:
{
name: "Ali",
value: undefined,
}
تفاوت JSON با Python Dictionary
Python Dictionary:
user = {
"name": "Sara",
"active": True,
"phone": None,
}
JSON معادل:
{
"name": "Sara",
"active": true,
"phone": null
}
تفاوت مقدارها:
| Python | JSON |
|---|---|
dict | Object |
list یا tuple | Array |
str | String |
int و float | Number |
True | true |
False | false |
None | null |
Python Dictionary یک Object داخل حافظه برنامه است. JSON متن دارای Syntax استاندارد است.
JSON با String چه تفاوتی دارد؟
این مقدار یک Dictionary پایتون است:
data = {
"name": "Darvareh",
"active": True,
}
این مقدار یک String حاوی JSON است:
json_text = """
{
"name": "Darvareh",
"active": true
}
"""
برای دسترسی به مقدار name در حالت دوم، ابتدا باید متن JSON را Parse کنید.
Serialization و Deserialization چیست؟
Serialization یعنی تبدیل Object داخلی برنامه به متن JSON.
مثال:
Python Dictionary
↓
JSON String
Deserialization یعنی تبدیل متن JSON به Object قابل استفاده در برنامه.
مثال:
JSON String
↓
Python Dictionary
در Python:
json.dumps()برای Serialization به Stringjson.loads()برای Deserialization از Stringjson.dump()برای نوشتن در فایلjson.load()برای خواندن از فایل
در JavaScript:
JSON.stringify()برای SerializationJSON.parse()برای Deserialization
کار با JSON در Python
Python کتابخانه داخلی json دارد و برای استفاده پایه به نصب پکیج جداگانه نیاز نیست.
import json
تبدیل Dictionary پایتون به JSON
import json
user = {
"id": 101,
"name": "سارا",
"active": True,
"phone": None,
"skills": [
"Python",
"Data Analysis",
],
}
json_text = json.dumps(user)
print(json_text)
print(type(json_text))
خروجی json.dumps() یک String است، نه Dictionary.
نمایش صحیح متن فارسی در Python
رفتار پیشفرض ممکن است کاراکترهای فارسی را به Unicode Escape تبدیل کند:
"\u0633\u0627\u0631\u0627"
برای نمایش خوانای فارسی:
json_text = json.dumps(
user,
ensure_ascii=False,
)
print(json_text)
خروجی:
{
"id": 101,
"name": "سارا",
"active": true,
"phone": null,
"skills": ["Python", "Data Analysis"]
}
Pretty Print کردن JSON
برای خوانایی بیشتر از indent استفاده کنید:
pretty_json = json.dumps(
user,
ensure_ascii=False,
indent=2,
)
print(pretty_json)
خروجی:
{
"id": 101,
"name": "سارا",
"active": true,
"phone": null,
"skills": [
"Python",
"Data Analysis"
]
}
در APIهای واقعی، Pretty Print معمولاً ضروری نیست و حجم داده را کمی افزایش میدهد. برای Log یا فایل قابل خواندن مفید است.
تبدیل JSON String به Dictionary
import json
json_text = """
{
"id": 101,
"name": "سارا",
"active": true,
"phone": null
}
"""
data = json.loads(json_text)
print(data)
print(type(data))
print(data["name"])
تبدیلها به شکل زیر انجام میشوند:
JSON object → Python dict
JSON array → Python list
JSON true → Python True
JSON false → Python False
JSON null → Python None
مدیریت JSON نامعتبر در Python
اگر Syntax اشتباه باشد، json.loads() خطای JSONDecodeError ایجاد میکند:
import json
invalid_json = """
{
"name": "Ali",
}
"""
try:
data = json.loads(invalid_json)
except json.JSONDecodeError as error:
print(f"Invalid JSON: {error}")
برای نمایش اطلاعات دقیقتر:
try:
data = json.loads(invalid_json)
except json.JSONDecodeError as error:
print(f"Message: {error.msg}")
print(f"Line: {error.lineno}")
print(f"Column: {error.colno}")
print(f"Position: {error.pos}")
در این مثال، کامای بعد از آخرین مقدار باعث خطا شده است.
نوشتن JSON در فایل با Python
import json
from pathlib import Path
data = {
"project": "Darvareh Client",
"version": 1,
"enabled": True,
"features": [
"chat",
"analysis",
"summarization",
],
}
file_path = Path("config.json")
with file_path.open(
"w",
encoding="utf-8",
) as file:
json.dump(
data,
file,
ensure_ascii=False,
indent=2,
)
فایل config.json ساخته میشود.
خواندن فایل JSON با Python
import json
from pathlib import Path
file_path = Path("config.json")
if not file_path.exists():
raise FileNotFoundError(
f"File not found: {file_path}"
)
with file_path.open(
"r",
encoding="utf-8",
) as file:
config = json.load(file)
print(config["project"])
print(config["features"])
نام تابعها را با هم اشتباه نکنید:
| تابع | ورودی یا خروجی |
|---|---|
json.dumps() | Object پایتون به String |
json.loads() | String به Object پایتون |
json.dump() | Object پایتون به فایل |
json.load() | فایل به Object پایتون |
حرف s در dumps و loads را میتوان بهصورت String به خاطر سپرد.
ذخیره Date در JSON با Python
JSON نوع Date ندارد. این کد مستقیم قابل Serialize نیست:
from datetime import datetime
import json
data = {
"created_at": datetime.now(),
}
json.dumps(data)
راه ساده، تبدیل تاریخ به String استاندارد است:
from datetime import datetime, timezone
import json
data = {
"created_at": (
datetime.now(timezone.utc)
.isoformat()
),
}
json_text = json.dumps(
data,
ensure_ascii=False,
)
print(json_text)
نمونه خروجی:
{
"created_at": "2026-08-06T10:30:00+00:00"
}
هنگام خواندن باید مشخص کنید کدام فیلدها Date هستند و آنها را دوباره Parse کنید.
دقت اعداد در JSON
JSON یک نوع عمومی Number دارد، اما زبانهای برنامهنویسی ممکن است عددها را با دقت متفاوت نگه دارند.
برای مقادیر حساس به دقت مانند مبلغ مالی، نباید بدون بررسی به float وابسته باشید.
در Python میتوانید عدد اعشاری JSON را با Decimal Parse کنید:
import json
from decimal import Decimal
json_text = """
{
"price": 19.99
}
"""
data = json.loads(
json_text,
parse_float=Decimal,
)
print(data["price"])
print(type(data["price"]))
اما Decimal نیز مستقیماً با json.dumps() قابل Serialize نیست و به Encoder یا تبدیل کنترلشده نیاز دارد. قرارداد نمایش عدد و واحد آن را در API بهوضوح تعریف کنید.
کار با JSON در JavaScript
JavaScript بهصورت داخلی Object سراسری JSON را ارائه میدهد.
دو متد اصلی:
JSON.parse()
JSON.stringify()
تبدیل JSON String به JavaScript Object
const jsonText = `{
"name": "Sara",
"active": true,
"skills": ["JavaScript", "React"]
}`;
try {
const user = JSON.parse(jsonText);
console.log(user.name);
console.log(user.skills[0]);
} catch (error) {
console.error("Invalid JSON:", error.message);
}
JSON.parse() در صورت نامعتبر بودن متن، SyntaxError ایجاد میکند.
تبدیل JavaScript Object به JSON
const user = {
id: 101,
name: "Sara",
active: true,
skills: ["JavaScript", "React"],
};
const jsonText = JSON.stringify(user);
console.log(jsonText);
برای Pretty Print:
const prettyJson = JSON.stringify(
user,
null,
2,
);
console.log(prettyJson);
پارامتر سوم تعداد فاصلههای Indent را مشخص میکند.
رفتار undefined و Function در JSON.stringify
مقادیر undefined و Function معادل مستقیمی در JSON ندارند.
const data = {
name: "Sara",
value: undefined,
greet() {
return "Hello";
},
};
console.log(JSON.stringify(data));
خروجی:
{
"name": "Sara"
}
Propertyهای دارای undefined و Function حذف میشوند.
در Array، undefined ممکن است به null تبدیل شود:
console.log(
JSON.stringify([
1,
undefined,
3,
])
);
خروجی:
[
1,
null,
3
]
بنابراین پیش از Serialization باید قرارداد داده را مشخص کنید.
BigInt و JSON در JavaScript
JSON.stringify() بهصورت پیشفرض نمیتواند BigInt را Serialize کند:
const value = 12345678901234567890n;
JSON.stringify({
value,
});
این عملیات خطا ایجاد میکند. اگر عدد بسیار بزرگ است، میتوانید آن را با قرارداد مشخص به String تبدیل کنید:
const data = {
value: value.toString(),
};
سرویس دریافتکننده باید بداند این String نماینده یک عدد بزرگ است.
دریافت JSON با Fetch API
async function loadModels() {
const response = await fetch(
"https://example.com/api/models",
{
headers: {
Accept: "application/json",
},
},
);
if (!response.ok) {
const errorText = await response.text();
throw new Error(
`Request failed: ${response.status} ${errorText}`,
);
}
const data = await response.json();
return data;
}
متد response.json() بدنه پاسخ را به Object یا Array جاوااسکریپت تبدیل میکند.
پیش از Parse بهتر است Status Code و در صورت نیاز Content-Type بررسی شود.
ارسال JSON با Fetch API
async function createItem(item) {
const response = await fetch(
"https://example.com/api/items",
{
method: "POST",
headers: {
"Content-Type": "application/json",
Accept: "application/json",
},
body: JSON.stringify(item),
},
);
if (!response.ok) {
throw new Error(
`Request failed with ${response.status}`,
);
}
return response.json();
}
قرارندادن JSON.stringify() باعث میشود Object جاوااسکریپت مستقیماً به بدنه HTTP تبدیل نشود.
Content-Type در JSON API
درخواست JSON معمولاً این Header را دارد:
Content-Type: application/json
این Header به سرور میگوید بدنه درخواست JSON است.
Header زیر بیان میکند Client انتظار پاسخ JSON دارد:
Accept: application/json
این دو Header نقش متفاوتی دارند:
| Header | مفهوم |
|---|---|
Content-Type | فرمت بدنهای که ارسال میشود |
Accept | فرمت پاسخ مورد انتظار |
JSON در HTTP API چگونه منتقل میشود؟
نمونه درخواست:
POST /v1/items HTTP/1.1
Host: api.example.com
Content-Type: application/json
Accept: application/json
{
"name": "Example",
"active": true
}
نمونه پاسخ:
HTTP/1.1 201 Created
Content-Type: application/json
{
"id": 120,
"name": "Example",
"active": true
}
JSON فقط بدنه داده است. Method، URL، Header و Status Code بخشی از HTTP هستند، نه JSON.
نمونه درخواست JSON با cURL
curl \
--request POST \
--url https://api.example.com/v1/items \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data '{
"name": "Example",
"active": true
}'
در Windows PowerShell، نحوه Quote و Escape ممکن است با Bash متفاوت باشد. اگر با خطای Syntax مواجه شدید، بدنه را داخل فایل JSON ذخیره کنید.
فایل request.json:
{
"name": "Example",
"active": true
}
ارسال فایل:
curl \
--request POST \
--url https://api.example.com/v1/items \
--header "Content-Type: application/json" \
--data @request.json
این روش برای Payloadهای طولانی خواناتر است.
ارسال JSON با requests در Python
import requests
payload = {
"name": "Example",
"active": True,
}
response = requests.post(
"https://api.example.com/v1/items",
json=payload,
timeout=30,
)
response.raise_for_status()
data = response.json()
print(data)
پارامتر json=payload معمولاً این کارها را انجام میدهد:
- Object پایتون را به JSON تبدیل میکند.
- بدنه درخواست را تنظیم میکند.
- Header مناسب JSON را قرار میدهد.
روش زیر نیز ممکن است، اما دستیتر است:
import json
import requests
response = requests.post(
"https://api.example.com/v1/items",
data=json.dumps(payload),
headers={
"Content-Type": "application/json",
},
timeout=30,
)
برای بیشتر درخواستهای معمول، json=payload سادهتر و کمخطاتر است.
آیا response.json همیشه موفق است؟
خیر. یک سرور ممکن است در زمان خطا HTML، متن ساده یا بدنه خالی برگرداند.
نمونه مدیریت بهتر:
import requests
response = requests.get(
"https://api.example.com/v1/items",
timeout=30,
)
try:
response.raise_for_status()
except requests.HTTPError as error:
preview = response.text[:300]
raise RuntimeError(
f"HTTP {response.status_code}: {preview}"
) from error
try:
data = response.json()
except requests.JSONDecodeError as error:
content_type = response.headers.get(
"Content-Type",
"",
)
raise RuntimeError(
"Expected JSON but received "
f"Content-Type={content_type}"
) from error
حتی اگر HTTP Status موفق باشد، ساختار داده باید جداگانه بررسی شود.
JSON در API هوش مصنوعی
در بیشتر APIهای مدلهای زبانی، درخواست شامل مواردی مانند اینها است:
- Model ID
- Messages
- Temperature
- Max Tokens
- ابزارها
- Response Format
- تنظیمات Streaming
نمونه درخواست:
{
"model": "YOUR_MODEL_ID",
"messages": [
{
"role": "system",
"content": "پاسخ دقیق و کوتاه ارائه کن."
},
{
"role": "user",
"content": "JSON را در یک جمله تعریف کن."
}
],
"temperature": 0.2
}
پاسخ نیز معمولاً JSON است:
{
"id": "request-example",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "JSON یک فرمت متنی سبک برای تبادل دادههای ساختاریافته است."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 25,
"completion_tokens": 18,
"total_tokens": 43
}
}
ساختار دقیق پاسخ میتواند به Endpoint، مدل و قابلیت مورد استفاده وابسته باشد.
اتصال به API هوش مصنوعی درواره با JSON و cURL
برای دریافت API Key در درواره ثبتنام کنید. شناسه مدل را نیز از صفحه مدلها و قیمتهای درواره بردارید.
نمونه درخواست:
curl \
--request POST \
--url https://api.darvareh.ir/v1/chat/completions \
--header "Authorization: Bearer YOUR_DARVAREH_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "YOUR_MODEL_ID",
"messages": [
{
"role": "system",
"content": "پاسخ را به زبان فارسی و دقیق ارائه کن."
},
{
"role": "user",
"content": "JSON چیست؟"
}
],
"temperature": 0.2
}'
API Key را داخل مخزن Git، کد Frontend، Screenshot یا فایل قابل انتشار قرار ندهید.
اتصال به API درواره با Python
ابتدا کتابخانهها را نصب کنید:
python -m pip install requests python-dotenv
فایل .env:
DARVAREH_API_KEY=YOUR_DARVAREH_API_KEY
DARVAREH_MODEL_ID=YOUR_MODEL_ID
فایل .gitignore:
.env
.venv/
__pycache__/
*.pyc
کد Python:
import os
import requests
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv("DARVAREH_API_KEY")
model_id = os.getenv("DARVAREH_MODEL_ID")
if not api_key:
raise RuntimeError(
"DARVAREH_API_KEY is not configured."
)
if not model_id:
raise RuntimeError(
"DARVAREH_MODEL_ID is not configured."
)
payload = {
"model": model_id,
"messages": [
{
"role": "system",
"content": (
"پاسخ را دقیق و به زبان فارسی "
"ارائه کن."
),
},
{
"role": "user",
"content": "JSON چیست؟",
},
],
"temperature": 0.2,
}
response = requests.post(
"https://api.darvareh.ir/v1/chat/completions",
headers={
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
},
json=payload,
timeout=60,
)
try:
response.raise_for_status()
except requests.HTTPError as error:
preview = response.text[:500]
raise RuntimeError(
f"API error {response.status_code}: "
f"{preview}"
) from error
try:
result = response.json()
except requests.JSONDecodeError as error:
raise RuntimeError(
"The API did not return valid JSON."
) from error
try:
content = (
result["choices"][0]["message"]["content"]
)
except (KeyError, IndexError, TypeError) as error:
raise RuntimeError(
"Unexpected API response structure."
) from error
print(content)
اتصال به API درواره با JavaScript
کلید API باید در Backend نگهداری شود، نه در JavaScript اجراشده داخل Browser.
نمونه برای Node.js:
const apiKey = process.env.DARVAREH_API_KEY;
const modelId = process.env.DARVAREH_MODEL_ID;
if (!apiKey) {
throw new Error(
"DARVAREH_API_KEY is not configured",
);
}
if (!modelId) {
throw new Error(
"DARVAREH_MODEL_ID is not configured",
);
}
const payload = {
model: modelId,
messages: [
{
role: "system",
content: "پاسخ را دقیق و فارسی ارائه کن.",
},
{
role: "user",
content: "JSON چیست؟",
},
],
temperature: 0.2,
};
const response = await fetch(
"https://api.darvareh.ir/v1/chat/completions",
{
method: "POST",
headers: {
Authorization: `Bearer ${apiKey}`,
"Content-Type": "application/json",
Accept: "application/json",
},
body: JSON.stringify(payload),
},
);
const responseText = await response.text();
if (!response.ok) {
throw new Error(
`API error ${response.status}: ` +
responseText.slice(0, 500),
);
}
let result;
try {
result = JSON.parse(responseText);
} catch {
throw new Error(
"The API did not return valid JSON",
);
}
const content =
result?.choices?.[0]?.message?.content;
if (typeof content !== "string") {
throw new Error(
"Unexpected API response structure",
);
}
console.log(content);
پروژه عملی: پردازش JSON و ذخیره پاسخ API
در این پروژه:
- درخواست را از فایل JSON میخوانیم.
- ساختار اولیه آن را بررسی میکنیم.
- درخواست را به API درواره میفرستیم.
- پاسخ JSON را Parse میکنیم.
- اطلاعات ضروری را استخراج میکنیم.
- نتیجه را در فایل JSON ذخیره میکنیم.
ساختار پروژه
json-ai-project/
├── .env
├── .gitignore
├── request.json
├── result.json
└── main.py
فایل request.json
{
"task": "summarize",
"language": "fa",
"text": "JSON یک فرمت متنی سبک برای نمایش و تبادل دادههای ساختاریافته است. این فرمت در APIهای وب، فایلهای تنظیمات و ارتباط بین سرویسها کاربرد گستردهای دارد.",
"settings": {
"max_sentences": 2,
"tone": "professional"
}
}
برنامه کامل Python
import json
import os
from pathlib import Path
from typing import Any
import requests
from dotenv import load_dotenv
DARVAREH_CHAT_URL = (
"https://api.darvareh.ir/v1/chat/completions"
)
def load_json_file(
file_path: Path,
) -> dict[str, Any]:
if not file_path.exists():
raise FileNotFoundError(
f"File not found: {file_path}"
)
try:
with file_path.open(
"r",
encoding="utf-8",
) as file:
data = json.load(file)
except json.JSONDecodeError as error:
raise ValueError(
"Invalid JSON in "
f"{file_path.name}: "
f"line {error.lineno}, "
f"column {error.colno}"
) from error
if not isinstance(data, dict):
raise ValueError(
"The root JSON value must be an object."
)
return data
def validate_request(
data: dict[str, Any],
) -> None:
required_fields = {
"task",
"language",
"text",
"settings",
}
missing_fields = required_fields.difference(
data.keys()
)
if missing_fields:
raise ValueError(
"Missing required fields: "
f"{sorted(missing_fields)}"
)
if data["task"] != "summarize":
raise ValueError(
"Only the summarize task is supported."
)
if not isinstance(data["text"], str):
raise ValueError(
"text must be a string."
)
if not data["text"].strip():
raise ValueError(
"text cannot be empty."
)
if not isinstance(data["settings"], dict):
raise ValueError(
"settings must be an object."
)
max_sentences = data["settings"].get(
"max_sentences"
)
if not isinstance(max_sentences, int):
raise ValueError(
"max_sentences must be an integer."
)
if not 1 <= max_sentences <= 10:
raise ValueError(
"max_sentences must be between 1 and 10."
)
def build_prompt(
data: dict[str, Any],
) -> str:
settings = data["settings"]
return f"""
متن زیر را خلاصه کن:
{data["text"]}
زبان خروجی: {data["language"]}
حداکثر تعداد جمله: {settings["max_sentences"]}
لحن: {settings.get("tone", "neutral")}
فقط خلاصه را برگردان.
اطلاعاتی خارج از متن اضافه نکن.
""".strip()
def call_darvareh(
prompt: str,
api_key: str,
model_id: str,
) -> dict[str, Any]:
payload = {
"model": model_id,
"messages": [
{
"role": "system",
"content": (
"تو یک دستیار دقیق برای "
"خلاصهسازی متن هستی."
),
},
{
"role": "user",
"content": prompt,
},
],
"temperature": 0.2,
}
try:
response = requests.post(
DARVAREH_CHAT_URL,
headers={
"Authorization": (
f"Bearer {api_key}"
),
"Content-Type": "application/json",
},
json=payload,
timeout=60,
)
except requests.Timeout as error:
raise RuntimeError(
"The API request timed out."
) from error
except requests.ConnectionError as error:
raise RuntimeError(
"Could not connect to the API."
) from error
try:
response.raise_for_status()
except requests.HTTPError as error:
preview = response.text[:500]
raise RuntimeError(
f"API error {response.status_code}: "
f"{preview}"
) from error
try:
result = response.json()
except requests.JSONDecodeError as error:
raise RuntimeError(
"The API response is not valid JSON."
) from error
if not isinstance(result, dict):
raise RuntimeError(
"The API response root must be an object."
)
return result
def extract_content(
result: dict[str, Any],
) -> str:
try:
content = (
result["choices"][0]
["message"]["content"]
)
except (
KeyError,
IndexError,
TypeError,
) as error:
raise RuntimeError(
"Unexpected API response structure."
) from error
if not isinstance(content, str):
raise RuntimeError(
"Response content must be a string."
)
return content.strip()
def save_result(
output_path: Path,
request_data: dict[str, Any],
content: str,
api_result: dict[str, Any],
) -> None:
output = {
"task": request_data["task"],
"result": content,
"model": api_result.get("model"),
"usage": api_result.get("usage"),
}
with output_path.open(
"w",
encoding="utf-8",
) as file:
json.dump(
output,
file,
ensure_ascii=False,
indent=2,
)
def main() -> None:
load_dotenv()
api_key = os.getenv("DARVAREH_API_KEY")
model_id = os.getenv("DARVAREH_MODEL_ID")
if not api_key:
raise RuntimeError(
"DARVAREH_API_KEY is not configured."
)
if not model_id:
raise RuntimeError(
"DARVAREH_MODEL_ID is not configured."
)
project_root = Path(__file__).resolve().parent
request_path = project_root / "request.json"
output_path = project_root / "result.json"
request_data = load_json_file(request_path)
validate_request(request_data)
prompt = build_prompt(request_data)
api_result = call_darvareh(
prompt=prompt,
api_key=api_key,
model_id=model_id,
)
content = extract_content(api_result)
save_result(
output_path=output_path,
request_data=request_data,
content=content,
api_result=api_result,
)
print(f"Result saved to: {output_path}")
if __name__ == "__main__":
main()
اجرای پروژه
python main.py
نمونه فایل result.json:
{
"task": "summarize",
"result": "JSON یک فرمت سبک و متنی برای تبادل دادههای ساختاریافته است که در APIها، تنظیمات نرمافزار و ارتباط میان سرویسها استفاده میشود.",
"model": "YOUR_MODEL_ID",
"usage": {
"prompt_tokens": 80,
"completion_tokens": 35,
"total_tokens": 115
}
}
مقدارها و ساختار دقیق پاسخ با توجه به مدل و Endpoint ممکن است متفاوت باشد. برنامه نباید بدون Validation به وجود تمام فیلدهای اختیاری وابسته باشد.
چرا فقط Parse کردن JSON کافی نیست؟
معتبر بودن Syntax JSON به معنی درست بودن داده نیست.
این JSON از نظر Syntax معتبر است:
{
"email": 125,
"age": -50,
"active": "yes"
}
اما ممکن است با قرارداد برنامه ناسازگار باشد:
emailباید String باشد.ageنباید منفی باشد.activeباید Boolean باشد.
پس سه مرحله متفاوت داریم:
- Parse کردن JSON
- اعتبارسنجی ساختار و نوع داده
- اعتبارسنجی قواعد کسبوکار
JSON Schema چیست؟
JSON Schema روشی استاندارد برای توصیف ساختار مورد انتظار یک سند JSON است.
Schema میتواند مشخص کند:
- ریشه Object است یا Array
- چه Propertyهایی مجاز هستند
- نوع هر Property چیست
- چه فیلدهایی Required هستند
- مقدار عددی در چه بازهای است
- String چه Pattern یا طولی دارد
- چه مقادیری برای Enum مجاز هستند
- آیا Property اضافی پذیرفته میشود
نمونه Schema:
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"age": {
"type": "integer",
"minimum": 0
},
"active": {
"type": "boolean"
}
},
"required": [
"name",
"active"
],
"additionalProperties": false
}
داده معتبر:
{
"name": "Sara",
"age": 28,
"active": true
}
داده نامعتبر:
{
"name": "",
"age": -5,
"active": "yes"
}
برای یادگیری مرحلهبهمرحله میتوانید راهنمای رسمی JSON Schema را ببینید.
JSON معمولی، JSON Mode و Structured Outputs
این مفاهیم را با هم اشتباه نگیرید.
JSON معمولی
فقط یک فرمت داده است. برنامه متن JSON را Parse میکند.
درخواست پرامپتی برای JSON
از مدل میخواهید در پاسخ JSON تولید کند. مدل ممکن است متن اضافه، Markdown یا ساختار اشتباه برگرداند.
JSON Mode
در مدلهای پشتیبانیشده میتواند تولید JSON قابل Parse را قابلپیشبینیتر کند، اما لزوماً تمام فیلدها و نوعهای مورد انتظار شما را تضمین نمیکند.
Structured Outputs
در مدلها و APIهای پشتیبانیشده، ساختار پاسخ با JSON Schema تعریف میشود تا خروجی با قرارداد مشخص هماهنگتر باشد.
پشتیبانی از JSON Mode، Structured Outputs و Schema به مدل و Endpoint وابسته است. قبل از استفاده، قابلیت مدل انتخابی را بررسی کنید.
آیا خروجی JSON مدل را میتوان مستقیم استفاده کرد؟
خیر. حتی اگر پاسخ از نظر Syntax معتبر باشد باید:
- JSON را Parse کنید.
- آن را با Schema اعتبارسنجی کنید.
- قواعد کسبوکار را بررسی کنید.
- مقدارهای حساس را محدود کنید.
- عملیات مجاز کاربر را بررسی کنید.
- قبل از ذخیره یا اجرای عملیات اثرگذار، کنترلهای برنامه را اعمال کنید.
JSON معتبر میتواند حاوی اطلاعات اشتباه یا نامناسب باشد. ساختار صحیح، صحت معنایی محتوا را تضمین نمیکند.
خطاهای رایج JSON
استفاده از Single Quote
نامعتبر:
{
'name': 'Ali'
}
صحیح:
{
"name": "Ali"
}
کلید بدون Double Quote
نامعتبر:
{
name: "Ali"
}
صحیح:
{
"name": "Ali"
}
کامای اضافه
نامعتبر:
{
"name": "Ali",
}
صحیح:
{
"name": "Ali"
}
نوشتن Comment
نامعتبر:
{
// User name
"name": "Ali"
}
JSON استاندارد از Comment پشتیبانی نمیکند.
در صورت نیاز به توضیح میتوانید فیلدی مانند _description تعریف کنید، اما مصرفکننده باید آن را بشناسد:
{
"_description": "Application settings",
"enabled": true
}
استفاده از True و False
نامعتبر:
{
"active": True
}
صحیح:
{
"active": true
}
استفاده از None
نامعتبر:
{
"phone": None
}
صحیح:
{
"phone": null
}
Double Quote بدون Escape
نامعتبر:
{
"message": "او گفت "سلام""
}
صحیح:
{
"message": "او گفت \"سلام\""
}
استفاده از undefined
نامعتبر:
{
"value": undefined
}
در JSON باید مقدار حذف یا با توجه به قرارداد به null تبدیل شود:
{
"value": null
}
قراردادن JSON داخل String اضافی
گاهی پاسخ واقعی به شکل زیر است:
"{\"name\":\"Ali\",\"active\":true}"
این مقدار یک JSON String است که داخل آن متن JSON دیگری قرار دارد. پس از Parse اول، هنوز String دارید و ممکن است به Parse دوم نیاز باشد.
وجود این وضعیت معمولاً نشان میدهد داده در یک مرحله بیشازحد Serialize شده است.
JSON داخل Markdown
مدل ممکن است پاسخ دهد:
```json
{
"category": "technical"
}
```
این متن بهصورت مستقیم JSON معتبر نیست؛ زیرا Fenceهای Markdown بخشی از JSON نیستند. بهتر است از قابلیت خروجی ساختاریافته مدل استفاده کنید و از حذف دستی Fenceها بهعنوان قرارداد اصلی Production استفاده نکنید.
Propertyهای تکراری
نمونه:
{
"status": "active",
"status": "disabled"
}
Parserهای مختلف ممکن است رفتار متفاوتی داشته باشند و اغلب یکی از مقدارها را نگه میدارند. از Key تکراری استفاده نکنید و در Validation آن را تشخیص دهید.
روش پیداکردن خطای JSON
برای عیبیابی:
- شماره خط و ستون خطا را بخوانید.
- Quoteهای باز و بسته را بررسی کنید.
- کامای آخر Object و Array را حذف کنید.
- مطمئن شوید Keyها داخل Double Quote هستند.
True،FalseوNoneرا اصلاح کنید.- Commentها را حذف کنید.
- Escape داخل Stringها را بررسی کنید.
- Brace و Bracketها را جفت کنید.
- Encoding فایل را روی UTF-8 نگه دارید.
- داده را با Parser واقعی زبان مقصد آزمایش کنید.
در Python میتوانید فایل را با ابزار داخلی بررسی کنید:
python -m json.tool request.json
اگر فایل معتبر باشد، نسخه فرمتشده چاپ میشود. اگر نامعتبر باشد، محل تقریبی خطا نمایش داده خواهد شد.
برای فرمتکردن و ذخیره خروجی:
python -m json.tool \
request.json \
request-formatted.json
نکات طراحی JSON برای API
نام کلیدها را ثابت نگه دارید
اگر API یکبار user_id و بار دیگر userId برگرداند، Client پیچیده میشود.
یکی از الگوها را انتخاب و ثابت استفاده کنید.
نوع فیلد را تغییر ندهید
نامناسب:
{
"count": 10
}
و در پاسخ دیگر:
{
"count": "10"
}
Client نباید مجبور باشد چند نوع متفاوت را برای یک فیلد حدس بزند.
نبود داده را روشن تعریف کنید
مشخص کنید هنگام نبود مقدار:
- Property حذف میشود؟
- مقدار
nullبرمیگردد؟ - String خالی استفاده میشود؟
- Array خالی برمیگردد؟
بهصورت تصادفی از همه این حالتها استفاده نکنید.
Date را استاندارد ارسال کنید
نمونه مناسب:
{
"created_at": "2026-08-06T10:30:00Z"
}
Timezone را مشخص کنید و فقط تاریخ محلی مبهم نفرستید.
واحد عدد را مشخص کنید
نامبهم:
{
"price": 500
}
روشنتر:
{
"amount": 500000,
"currency": "IRR"
}
برای اندازه فایل:
{
"size_bytes": 1048576
}
Error Response یکپارچه طراحی کنید
نمونه:
{
"error": {
"code": "INVALID_INPUT",
"message": "The request is invalid.",
"details": [
{
"field": "email",
"reason": "Invalid format"
}
]
}
}
Client باید بتواند خطا را بدون Parse متن آزاد پردازش کند.
داده اضافی را بیدلیل ارسال نکنید
Payload بزرگتر باعث افزایش زمان انتقال، مصرف حافظه و در APIهای مدل زبانی افزایش توکن ورودی میشود.
فقط داده موردنیاز همان عملیات را ارسال کنید.
چکلیست JSON مناسب برای API
پیش از ارسال یا انتشار بررسی کنید:
- JSON با Parser واقعی قابل Parse است.
- Keyها داخل Double Quote هستند.
- کامای اضافه وجود ندارد.
- Comment وجود ندارد.
- نوع فیلدها ثابت است.
- فیلدهای Required مشخصاند.
- رفتار
nullتعریف شده است. - تاریخ دارای فرمت و Timezone مشخص است.
- مبلغ دارای واحد است.
- اطلاعات اضافی حذف شدهاند.
- داده ورودی Validation میشود.
- پاسخ API فقط براساس Status Code تفسیر نمیشود.
Content-Typeبررسی میشود.- خطاهای Parse مدیریت میشوند.
- API Key داخل JSON منتشرشده قرار ندارد.
- خروجی مدل پیش از استفاده Validate میشود.
- Schema با نسخه API هماهنگ است.
پرسشهای متداول
JSON مخفف چیست؟
JSON مخفف JavaScript Object Notation است.
آیا JSON یک زبان برنامهنویسی است؟
خیر. JSON یک فرمت متنی برای نمایش و تبادل داده است و قابلیتهایی مانند تابع، شرط، حلقه یا اجرای کد ندارد.
پسوند فایل JSON چیست؟
پسوند رایج آن .json است:
config.json
data.json
response.json
MIME Type فایل JSON چیست؟
مقدار رایج و استاندارد:
application/json
تفاوت JSON و XML چیست؟
JSON معمولاً کوتاهتر و برای برنامههای Web و JavaScript سادهتر است. XML قابلیتهایی مانند Attribute، Namespace و Schemaهای خاص خود را دارد. انتخاب به نوع سیستم و قرارداد موجود بستگی دارد.
آیا میتوان در JSON کامنت نوشت؟
در JSON استاندارد خیر. بعضی ابزارها فرمتهایی مانند JSONC ارائه میدهند، اما JSONC را نباید بدون هماهنگی به Parser استاندارد JSON ارسال کنید.
آیا ترتیب Keyها در JSON مهم است؟
برنامه نباید معنای Object را به ترتیب Keyها وابسته کند. Array ترتیبدار است، اما Propertyهای Object باید با نام آنها پردازش شوند.
آیا JSON از متن فارسی پشتیبانی میکند؟
بله. Stringهای JSON از Unicode پشتیبانی میکنند. فایلها و ارتباطات خود را با UTF-8 مدیریت کنید.
تفاوت json.load و json.loads چیست؟
json.load از فایل میخواند و json.loads از String.
تفاوت json.dump و json.dumps چیست؟
json.dump در فایل مینویسد و json.dumps یک String برمیگرداند.
تفاوت JSON و JSON Schema چیست؟
JSON خود داده است. JSON Schema قرارداد و محدودیتهای ساختار آن داده را توصیف میکند.
آیا پاسخ JSON مدل هوش مصنوعی همیشه معتبر است؟
خیر. درخواست متنی ساده تضمین نمیکند مدل همیشه JSON معتبر و مطابق Schema تولید کند. در صورت پشتیبانی مدل از JSON Mode یا Structured Outputs استفاده و خروجی را سمت برنامه Validate کنید.
آیا میتوان API Key را داخل JSON درخواست قرار داد؟
روش معمول ارسال API Key استفاده از Header احراز هویت است:
Authorization: Bearer YOUR_DARVAREH_API_KEY
قراردادن کلید داخل بدنه بدون نیاز، احتمال ثبت یا انتشار ناخواسته آن را افزایش میدهد.
Base URL درواره چیست؟
https://api.darvareh.ir/v1
قیمت استفاده از مدلها چگونه محاسبه میشود؟
قیمت به مدل و نوع ورودی و خروجی وابسته است و ممکن است تغییر کند. برای اطلاعات بهروز، صفحه مدلها و قیمتهای درواره را بررسی کنید.
جمعبندی
JSON یک فرمت متنی سبک، مستقل از زبان و بسیار پرکاربرد برای تبادل دادههای ساختاریافته است. Object و Array دو ساختار اصلی آن هستند و مقدارها میتوانند String، Number، Boolean، null، Object یا Array باشند.
برای کار مطمئن با JSON باید چند اصل را رعایت کنید:
- JSON را با Object زبان برنامهنویسی اشتباه نگیرید.
- Key و String را با Double Quote بنویسید.
- از Trailing Comma، Comment و
undefinedاستفاده نکنید. - داده را با Parser استاندارد Parse کنید.
- بعد از Parse، ساختار و قواعد کسبوکار را Validate کنید.
- Date، مبلغ و عددهای بزرگ را با قرارداد روشن منتقل کنید.
- در Python از
json.load،json.loads،json.dumpوjson.dumpsدرست استفاده کنید. - در JavaScript از
JSON.parseوJSON.stringifyاستفاده کنید. - برای HTTP Header مناسب
Content-Typeرا تنظیم کنید. - پاسخ API و مدل هوش مصنوعی را قبل از استفاده بررسی کنید.
JSON دروازه ورود به بسیاری از مفاهیم مهمتر مانند REST API، Webhook، JSON Schema، Structured Outputs، Function Calling و توسعه اپلیکیشنهای هوش مصنوعی است.
برای آزمایش JSON در یک API واقعی میتوانید در درواره ثبتنام کرده، API Key بسازید و با Base URL یکپارچه درواره به مدلهای مختلف هوش مصنوعی متصل شوید. Model IDها و قیمت بهروز آنها در صفحه مدلهای درواره قرار دارد.
منابع رسمی
- وبسایت رسمی JSON
- راهنمای کار با JSON در MDN
- مستندات کتابخانه JSON در Python
- مستندات JSON.parse در JavaScript
- راهنمای رسمی JSON Schema
مقالات مرتبط
- Structured Outputs چیست؟ آموزش دریافت خروجی JSON از مدلهای هوش مصنوعی
- API هوش مصنوعی چیست و چگونه از آن استفاده کنیم؟
- OpenAI-Compatible API چیست و چگونه کار میکند؟
- آموزش اتصال به API درواره با cURL
- آموزش هوش مصنوعی با پایتون؛ ساخت پروژه واقعی با API
- دریافت API هوش مصنوعی؛ آموزش ساخت API Key و اتصال
- Function Calling و Tool Calling چیست؟
برای مطالعه شرایط استفاده و محدودیتهای مسئولیت، صفحه «سلب مسئولیت» را مشاهده کنید.