کتابخانه‌ی استاندارد · کدگذاری و داده

تبدیل قالب encoding/serde

تشخیص قالب یک متن و تبدیل مستقیم جیسون، یامل، تامل، اکس‌ام‌ال و سی اس وی به یکدیگر.

واردسازی کدگذاری.تبدیل قالب

این بسته متن را با یک فراخوانی از یک قالب داده به قالب دیگر تبدیل می‌کند. تبدیل قالب ورودی را با کدگشای همان قالب می‌خواند، آن را به شکل یک مقدار نگه می‌دارد و با کدگذار قالب مقصد می‌نویسد. تشخیص قالب حدس می‌زند متن به کدام قالب است. نام قالب‌ها رشته‌های کوچک json، yaml، toml، xml و csv هستند؛ "JSON" شناخته نمی‌شود.

این بسته به کار ابزارهایی می‌آید که هر قالبی را از کاربر می‌پذیرند، و برای جابه‌جایی‌های یک‌باره. وقتی برنامه‌تان خود داده را لازم دارد، بسته‌ی همان قالب را صدا بزنید (جیسون، یامل، تامل، اکس‌ام‌ال، سی اس وی): آن‌ها یک مقدار برمی‌گردانند یا ساختاری را پر می‌کنند و پیام خطای واقعی می‌دهند، در حالی که این بسته فقط بله یا نه می‌گوید. مسج‌پک دودویی است و جزو این نام‌ها نیست؛ برای آن بسته‌ی مسج‌پک را به کار ببرید.

در تبدیل چه چیزی می‌ماند

همه چیز از یک مقدار می‌گذرد، پس توضیح‌ها و قالب‌بندی همیشه از دست می‌روند و کلیدها به همان ترتیبی که خوانده شده‌اند می‌مانند. گذشته از این، هر قالب کمتر از جیسون نگه می‌دارد:

قالبخواندن چه می‌دهدنوشتن چه چیزی را از دست می‌دهد
جیسون، یاملهمه‌ی نوع‌هایامل عدد اعشاری 2.0 را 2 می‌نویسد که دوباره صحیح خوانده می‌شود
تاملهمه‌ی نوع‌ها جز تهی؛ تاریخ‌ها به شکل رشتهکلیدهای تهی حذف می‌شوند؛ سطح بالا باید شیء باشد
اکس‌ام‌الفقط رشته، شیء و آرایه (برای عنصرهای تکراری)؛ ویژگی‌ها به شکل @name و متن به شکل #text؛ نام عنصر بیرونی حذف می‌شودعددها و مقدارهای منطقی متن می‌شوند؛ خروجی درون <root> پیچیده می‌شود
سی اس ویآرایه‌ای از شیء‌ها، یکی برای هر سطر، و همه‌ی خانه‌ها رشتهآرایه‌ای از شیء‌ها لازم دارد؛ فقط فیلدهای رشته‌ای نوشته می‌شوند و عددها و مقدارهای منطقی خانه‌ی خالی می‌شوند

اشتباه‌های رایج

  • تشخیص یک حدس است. ترتیب بررسی این است: اکس‌ام‌ال (متنی که با < آغاز شود)، جیسون، تامل، سی اس وی و سپس یامل؛ و تقریباً هر متن ساده‌ای مثل hello world یامل معتبر است. هر وقت پسوند پرونده یا Content-Type قالب را می‌گوید، خودتان آن را بدهید.
  • تبدیل قالب شکست را پنهان می‌کند و فقط رشته‌ی خالی می‌دهد. تبدیل قالب سخت گیرانه را به کار ببرید و ok را بررسی کنید.
  • خواندن سی اس وی هیچ‌وقت شکست نمی‌خورد، پس برای هر متنی که به شکل سی اس وی خوانده شود ok درست است.

راهنما: پذیرفتن هر قالبی

ابزاری که تنظیم یا داده را از کاربر می‌گیرد لازم نیست روی یک قالب پافشاری کند. تشخیص قالب به متن نگاه می‌کند و نام قالب را می‌گوید: اکس‌ام‌ال اگر با < شروع شود، جیسون اگر به شکل جیسون تجزیه شود، سپس تامل، CSV و در آخر یامل. این نام را به تبدیل قالب سخت گیرانه بدهید تا هر چه رسیده به همان یک قالبی تبدیل شود که کد شما می‌خواند.

encoding-serde-guide-anything.salam
واردسازی کدگذاری.تبدیل قالب

تابع به جیسون(متن: رشته): رشته:
    نوع قالب := تبدیل قالب.تشخیص قالب(متن)
    اگر نوع قالب == "":
        برگشت "(قالب ناشناخته)"
    پایان
    ناپایا شد := نادرست
    خروجی := تبدیل قالب.تبدیل قالب سخت گیرانه(متن، نوع قالب، "json"، شد)
    اگر وارونه شد:
        برگشت "(خواندن " + نوع قالب + " نشد)"
    پایان
    برگشت نوع قالب + " -> " + خروجی
پایان

تابع ریشه:
    سرچاپ به جیسون("name: shop\nport: 8080\n")
    سرچاپ به جیسون("name = \"shop\"\nport = 8080\n")
    سرچاپ به جیسون("name,port\nshop,8080\n")
    سرچاپ به جیسون(`{"name": "shop", "port": 8080}`)
    سرچاپ به جیسون("")
پایان
خروجیyaml -> {"name": "shop", "port": 8080} toml -> {"name": "shop", "port": 8080} csv -> [{"name": "shop", "port": "8080"}] json -> {"name": "shop", "port": 8080} (قالب ناشناخته)

تشخیص، حدسی از شکل متن است. ورودی‌های خیلی کوتاه ممکن است با بیش از یک قالب جور باشند و تقریباً هر متن ساده‌ای یامل معتبر است، پس وقتی قالب را می‌دانید، از پسوند پرونده یا سرآیند Content-Type، خودتان آن را بدهید.

راهنما: بردن پیکربندی به قالبی دیگر

جابه‌جا کردن یک پروژه از یامل به تامل، یا برعکس، یک فراخوانی است. تبدیل کنید و سپس نتیجه را بیازمایید: متن قدیم و جدید را هر دو به جیسون برگردانید، کدگشایی کنید و دو مقدار را با مقدار.یکسان است مقایسه کنید. مقایسه‌ی متن جیسون فقط به خاطر ترتیب کلیدها ممکن است شکست بخورد.

encoding-serde-guide-migrate.salam
واردسازی کدگذاری.تبدیل قالب
واردسازی کدگذاری.جیسون
واردسازی کدگذاری.مقدار
واردسازی کدگذاری.خطای کدگذاری

تابع ریشه:
    قدیمی := `server:
  host: 0.0.0.0
  port: 8080
log:
  level: info
`
    ناپایا شد := نادرست
    متن تامل := تبدیل قالب.تبدیل قالب سخت گیرانه(قدیمی، "yaml"، "toml"، شد)
    سرچاپ "تبدیل شد:"، شد
    چاپ متن تامل

    ناپایا خطا := خطای کدگذاری.بدون خطا()
    پیش := جیسون.کدگشایی(تبدیل قالب.تبدیل قالب(قدیمی، "yaml"، "json")، خطا)
    پس := جیسون.کدگشایی(تبدیل قالب.تبدیل قالب(متن تامل، "toml"، "json")، خطا)
    سرچاپ "همان داده:"، مقدار.یکسان است(پیش، پس)
پایان
خروجیتبدیل شد: true [server] host = "0.0.0.0" port = 8080 [log] level = "info" همان داده: true

توضیح‌ها باقی نمی‌مانند، چون یک مقدار فقط داده را نگه می‌دارد؛ پس پیش از تبدیل به کسانی که پرونده را با دست ویرایش می‌کنند خبر بدهید.

راهنما: اکس‌ام‌ال در ورود و خروج

اکس‌ام‌ال آرایه و عدد ندارد، پس نگاشت از چند قاعده پیروی می‌کند: کلید @نام یک ویژگی می‌شود، آرایه همان عنصر را تکرار می‌کند، #text متن عنصر می‌شود و سند تبدیل‌شده درون عنصر <root> پیچیده می‌شود. خواندن اکس‌ام‌ال همه‌ی مقدارها را رشته و ویژگی‌ها را کلیدهای @ می‌دهد.

encoding-serde-guide-xml.salam
واردسازی کدگذاری.تبدیل قالب

تابع ریشه:
    سفارش := `{"@id": 1042, "customer": "Sara", "item": ["tea", "cups"], "total": 39.5, "paid": true}`
    ایکس := تبدیل قالب.تبدیل قالب(سفارش، "json"، "xml")
    سرچاپ ایکس
    سرچاپ "تشخیص:"، تبدیل قالب.تشخیص قالب(ایکس)
    سرچاپ "برگشت:"، تبدیل قالب.تبدیل قالب(ایکس، "xml"، "json")
    سرچاپ تبدیل قالب.تبدیل قالب("<book lang=\"fa\"><title>Salam</title><pages>153</pages></book>"، "xml"، "json")
پایان
خروجی<?xml version="1.0" encoding="UTF-8"?> <root id="1042"><customer>Sara</customer><item>tea</item><item>cups</item><total>39.5</total><paid>true</paid></root> تشخیص: xml برگشت: {"@id": "1042", "customer": "Sara", "item": ["tea", "cups"], "total": "39.5", "paid": "true"} {"@lang": "fa", "title": "Salam", "pages": "153"}

عددها و مقدارهای منطقی به شکل متن نوشته می‌شوند، پس 39.5 و true به اکس‌ام‌ال می‌رسند. مسیر برگشت نشان می‌دهد اکس‌ام‌ال چه چیزی را نمی‌تواند بیان کند: همه‌ی مقدارها رشته برمی‌گردند و <root> یا <book> بیرونی حذف می‌شود و فقط محتوایش می‌ماند. هر جا نام عنصرها، ترتیب یا فضای نام مهم است، سند را مستقیم با بسته‌ی اکس‌ام‌ال بسازید.

راهنما: رسیدگی به شکست

تبدیل قالب سخت گیرانه با ok می‌گوید هر دو نیمه کار کرده یا نه: خواندن در قالب مبدأ و نوشتن در قالب مقصد. روی ورودی خراب، نام قالبی که نمی‌شناسد، و داده‌ای که مقصد نمی‌تواند نگه دارد، مثل آرایه‌ی سطح بالا برای تامل، شکست می‌خورد. تبدیل قالب در همه‌ی این حالت‌ها فقط رشته‌ی خالی برمی‌گرداند.

encoding-serde-guide-errors.salam
واردسازی کدگذاری.تبدیل قالب

تابع آزمودن(برچسب: رشته، داده: رشته، از قالب: رشته، به قالب: رشته):
    ناپایا شد := نادرست
    خروجی := تبدیل قالب.تبدیل قالب سخت گیرانه(داده، از قالب، به قالب، شد)
    اگر شد:
        سرچاپ برچسب، "درست:"، خروجی
    وگرنه:
        سرچاپ برچسب، "شکست خورد"
    پایان
پایان

تابع ریشه:
    آزمودن("یامل درست     "، "- 1\n- 2\n"، "yaml"، "json")
    آزمودن("جیسون خراب    "، `{"a": 1`، "json"، "yaml")
    آزمودن("مبدأ ناشناخته "، `a = 1`، "ini"، "json")
    آزمودن("مقصد ناشناخته "، `{"a": 1}`، "json"، "ini")
    آزمودن("تامل جدول می‌خواهد"، `[1, 2]`، "json"، "toml")
    سرچاپ "نسخه‌ی آسان‌گیر [" + تبدیل قالب.تبدیل قالب(`{"a": 1`، "json"، "yaml") + "] می‌دهد"
پایان
خروجییامل درست درست: [1, 2] جیسون خراب شکست خورد مبدأ ناشناخته شکست خورد مقصد ناشناخته شکست خورد تامل جدول می‌خواهد شکست خورد نسخه‌ی آسان‌گیر [] می‌دهد

پایاها و متغیرها

قالب ناشناخته FormatUnknown

پایا قالب ناشناخته: صحیح۳۲ = 0
قالب ناشناخته.
encoding-serde-Transcode.salam
واردسازی کدگذاری.تبدیل قالب

تابع ریشه:
    جیسون := `{"name": "salam", "port": 8080, "tags": ["a", "b"]}`
    سرچاپ تبدیل قالب.تشخیص قالب(جیسون)، تبدیل قالب.تشخیص قالب("a: 1\nb: 2\n")، تبدیل قالب.تشخیص قالب("<a/>")، تبدیل قالب.تشخیص قالب("[x]\ny = 1\n")، تبدیل قالب.تشخیص قالب("a,b\n1,2\n")
    سرچاپ تبدیل قالب.تشخیص شماره قالب(جیسون) == تبدیل قالب.قالب جیسون، تبدیل قالب.قالب ناشناخته، تبدیل قالب.قالب یامل، تبدیل قالب.قالب تامل، تبدیل قالب.قالب اکس‌ام‌ال، تبدیل قالب.قالب سی اس وی
    سرچاپ تبدیل قالب.تبدیل قالب(جیسون، "json"، "yaml")
    سرچاپ تبدیل قالب.تبدیل قالب(جیسون، "json"، "toml")
    سرچاپ تبدیل قالب.تبدیل قالب("name,age\nعلی,30\n"، "csv"، "json")
    ناپایا شد := نادرست
    _ := تبدیل قالب.تبدیل قالب سخت گیرانه(جیسون، "json"، "pdf"، شد)
    سرچاپ شد
پایان
خروجیjson yaml xml toml csv true 0 2 3 4 5 name: salam port: 8080 tags: - a - b name = "salam" port = 8080 tags = ["a", "b"] [{"name": "علی", "age": "30"}] false

قالب جیسون FormatJSON

پایا قالب جیسون: صحیح۳۲ = 1
جیسون.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-serde-Transcode.salam

قالب یامل FormatYAML

پایا قالب یامل: صحیح۳۲ = 2
یامل.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-serde-Transcode.salam

قالب تامل FormatTOML

پایا قالب تامل: صحیح۳۲ = 3
تامل.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-serde-Transcode.salam

قالب اکس‌ام‌ال FormatXML

پایا قالب اکس‌ام‌ال: صحیح۳۲ = 4
اکس‌ام‌ال.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-serde-Transcode.salam

قالب سی اس وی FormatCSV

پایا قالب سی اس وی: صحیح۳۲ = 5
سی اس وی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-serde-Transcode.salam

تابع‌ها

تشخیص شماره قالب DetectFormat

تابع تشخیص شماره قالب(text: رشته): صحیح
حدس می‌زند متن به کدام قالب است و یکی از ثابت‌های قالب را برمی‌گرداند: اکس‌ام‌ال اگر با < شروع شود، سپس جیسون، تامل، سی اس وی و یامل، هر کدام که زودتر تجزیه شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-serde-Transcode.salam

تشخیص قالب Detect

تابع تشخیص قالب(text: رشته): رشته
مثل تابع بالا، ولی نام کوتاه قالب را برمی‌گرداند، یا رشته‌ی خالی اگر هیچ قالبی جور نباشد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-serde-Transcode.salam

تبدیل قالب سخت گیرانه TranscodeStrict

تابع تبدیل قالب سخت گیرانه(data: رشته، from: رشته، dest: رشته، ok &: منطقی): رشته
متن را از قالب from به dest تبدیل می‌کند؛ اگر خواندن یا نوشتن شکست بخورد یا نام قالب نادرست باشد، ok نادرست می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-serde-Transcode.salam

تبدیل قالب Transcode

تابع تبدیل قالب(data: رشته، from: رشته، dest: رشته): رشته
متن را از یک قالب به قالب دیگر تبدیل می‌کند؛ هر شکستی رشته‌ی خالی می‌دهد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-serde-Transcode.salam