تبدیل قالب encoding/serde
تشخیص قالب یک متن و تبدیل مستقیم جیسون، یامل، تامل، اکسامال و سی اس وی به یکدیگر.
واردسازی کدگذاری.تبدیل قالب
این بسته متن را با یک فراخوانی از یک قالب داده به قالب دیگر تبدیل میکند. تبدیل قالب ورودی را با کدگشای همان قالب میخواند، آن را به شکل یک مقدار نگه میدارد و با کدگذار قالب مقصد مینویسد. تشخیص قالب حدس میزند متن به کدام قالب است. نام قالبها رشتههای کوچک json، yaml، toml، xml و csv هستند؛ "JSON" شناخته نمیشود.
این بسته به کار ابزارهایی میآید که هر قالبی را از کاربر میپذیرند، و برای جابهجاییهای یکباره. وقتی برنامهتان خود داده را لازم دارد، بستهی همان قالب را صدا بزنید (جیسون، یامل، تامل، اکسامال، سی اس وی): آنها یک مقدار برمیگردانند یا ساختاری را پر میکنند و پیام خطای واقعی میدهند، در حالی که این بسته فقط بله یا نه میگوید. مسجپک دودویی است و جزو این نامها نیست؛ برای آن بستهی مسجپک را به کار ببرید.
در تبدیل چه چیزی میماند
همه چیز از یک مقدار میگذرد، پس توضیحها و قالببندی همیشه از دست میروند و کلیدها به همان ترتیبی که خوانده شدهاند میمانند. گذشته از این، هر قالب کمتر از جیسون نگه میدارد:
| قالب | خواندن چه میدهد | نوشتن چه چیزی را از دست میدهد |
|---|---|---|
| جیسون، یامل | همهی نوعها | یامل عدد اعشاری 2.0 را 2 مینویسد که دوباره صحیح خوانده میشود |
| تامل | همهی نوعها جز تهی؛ تاریخها به شکل رشته | کلیدهای تهی حذف میشوند؛ سطح بالا باید شیء باشد |
| اکسامال | فقط رشته، شیء و آرایه (برای عنصرهای تکراری)؛ ویژگیها به شکل @name و متن به شکل #text؛ نام عنصر بیرونی حذف میشود | عددها و مقدارهای منطقی متن میشوند؛ خروجی درون <root> پیچیده میشود |
| سی اس وی | آرایهای از شیءها، یکی برای هر سطر، و همهی خانهها رشته | آرایهای از شیءها لازم دارد؛ فقط فیلدهای رشتهای نوشته میشوند و عددها و مقدارهای منطقی خانهی خالی میشوند |
اشتباههای رایج
- تشخیص یک حدس است. ترتیب بررسی این است: اکسامال (متنی که با
<آغاز شود)، جیسون، تامل، سی اس وی و سپس یامل؛ و تقریباً هر متن سادهای مثلhello worldیامل معتبر است. هر وقت پسوند پرونده یاContent-Typeقالب را میگوید، خودتان آن را بدهید. تبدیل قالبشکست را پنهان میکند و فقط رشتهی خالی میدهد.تبدیل قالب سخت گیرانهرا به کار ببرید وokرا بررسی کنید.- خواندن سی اس وی هیچوقت شکست نمیخورد، پس برای هر متنی که به شکل سی اس وی خوانده شود
okدرست است.
راهنما: پذیرفتن هر قالبی
ابزاری که تنظیم یا داده را از کاربر میگیرد لازم نیست روی یک قالب پافشاری کند. تشخیص قالب به متن نگاه میکند و نام قالب را میگوید: اکسامال اگر با < شروع شود، جیسون اگر به شکل جیسون تجزیه شود، سپس تامل، CSV و در آخر یامل. این نام را به تبدیل قالب سخت گیرانه بدهید تا هر چه رسیده به همان یک قالبی تبدیل شود که کد شما میخواند.
واردسازی کدگذاری.تبدیل قالب
تابع به جیسون(متن: رشته): رشته:
نوع قالب := تبدیل قالب.تشخیص قالب(متن)
اگر نوع قالب == "":
برگشت "(قالب ناشناخته)"
پایان
ناپایا شد := نادرست
خروجی := تبدیل قالب.تبدیل قالب سخت گیرانه(متن، نوع قالب، "json"، شد)
اگر وارونه شد:
برگشت "(خواندن " + نوع قالب + " نشد)"
پایان
برگشت نوع قالب + " -> " + خروجی
پایان
تابع ریشه:
سرچاپ به جیسون("name: shop\nport: 8080\n")
سرچاپ به جیسون("name = \"shop\"\nport = 8080\n")
سرچاپ به جیسون("name,port\nshop,8080\n")
سرچاپ به جیسون(`{"name": "shop", "port": 8080}`)
سرچاپ به جیسون("")
پایانتشخیص، حدسی از شکل متن است. ورودیهای خیلی کوتاه ممکن است با بیش از یک قالب جور باشند و تقریباً هر متن سادهای یامل معتبر است، پس وقتی قالب را میدانید، از پسوند پرونده یا سرآیند Content-Type، خودتان آن را بدهید.
راهنما: بردن پیکربندی به قالبی دیگر
جابهجا کردن یک پروژه از یامل به تامل، یا برعکس، یک فراخوانی است. تبدیل کنید و سپس نتیجه را بیازمایید: متن قدیم و جدید را هر دو به جیسون برگردانید، کدگشایی کنید و دو مقدار را با مقدار.یکسان است مقایسه کنید. مقایسهی متن جیسون فقط به خاطر ترتیب کلیدها ممکن است شکست بخورد.
واردسازی کدگذاری.تبدیل قالب
واردسازی کدگذاری.جیسون
واردسازی کدگذاری.مقدار
واردسازی کدگذاری.خطای کدگذاری
تابع ریشه:
قدیمی := `server:
host: 0.0.0.0
port: 8080
log:
level: info
`
ناپایا شد := نادرست
متن تامل := تبدیل قالب.تبدیل قالب سخت گیرانه(قدیمی، "yaml"، "toml"، شد)
سرچاپ "تبدیل شد:"، شد
چاپ متن تامل
ناپایا خطا := خطای کدگذاری.بدون خطا()
پیش := جیسون.کدگشایی(تبدیل قالب.تبدیل قالب(قدیمی، "yaml"، "json")، خطا)
پس := جیسون.کدگشایی(تبدیل قالب.تبدیل قالب(متن تامل، "toml"، "json")، خطا)
سرچاپ "همان داده:"، مقدار.یکسان است(پیش، پس)
پایانتوضیحها باقی نمیمانند، چون یک مقدار فقط داده را نگه میدارد؛ پس پیش از تبدیل به کسانی که پرونده را با دست ویرایش میکنند خبر بدهید.
راهنما: اکسامال در ورود و خروج
اکسامال آرایه و عدد ندارد، پس نگاشت از چند قاعده پیروی میکند: کلید @نام یک ویژگی میشود، آرایه همان عنصر را تکرار میکند، #text متن عنصر میشود و سند تبدیلشده درون عنصر <root> پیچیده میشود. خواندن اکسامال همهی مقدارها را رشته و ویژگیها را کلیدهای @ میدهد.
واردسازی کدگذاری.تبدیل قالب
تابع ریشه:
سفارش := `{"@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")
پایانعددها و مقدارهای منطقی به شکل متن نوشته میشوند، پس 39.5 و true به اکسامال میرسند. مسیر برگشت نشان میدهد اکسامال چه چیزی را نمیتواند بیان کند: همهی مقدارها رشته برمیگردند و <root> یا <book> بیرونی حذف میشود و فقط محتوایش میماند. هر جا نام عنصرها، ترتیب یا فضای نام مهم است، سند را مستقیم با بستهی اکسامال بسازید.
راهنما: رسیدگی به شکست
تبدیل قالب سخت گیرانه با ok میگوید هر دو نیمه کار کرده یا نه: خواندن در قالب مبدأ و نوشتن در قالب مقصد. روی ورودی خراب، نام قالبی که نمیشناسد، و دادهای که مقصد نمیتواند نگه دارد، مثل آرایهی سطح بالا برای تامل، شکست میخورد. تبدیل قالب در همهی این حالتها فقط رشتهی خالی برمیگرداند.
واردسازی کدگذاری.تبدیل قالب
تابع آزمودن(برچسب: رشته، داده: رشته، از قالب: رشته، به قالب: رشته):
ناپایا شد := نادرست
خروجی := تبدیل قالب.تبدیل قالب سخت گیرانه(داده، از قالب، به قالب، شد)
اگر شد:
سرچاپ برچسب، "درست:"، خروجی
وگرنه:
سرچاپ برچسب، "شکست خورد"
پایان
پایان
تابع ریشه:
آزمودن("یامل درست "، "- 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") + "] میدهد"
پایانپایاها و متغیرها
قالب ناشناخته FormatUnknown
پایا قالب ناشناخته: صحیح۳۲ = 0واردسازی کدگذاری.تبدیل قالب
تابع ریشه:
جیسون := `{"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"، شد)
سرچاپ شد
پایانقالب جیسون 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