§

Liƙa JSON ko YAML da kake son canza.

Yanayi
Shinge
Zaɓuɓɓuka
§

Fitarwa

yaml

Tsallake tsakanin JSON da YAML aiki ne na yau da kullum ga ƙungiyoyin dandali a Najeriya da duk Afirka. Manifests na Kubernetes, tsarin GitHub Actions, da faylolin tsari na API duk suna buƙatar canzawa tsakanin waɗannan tsarin biyu lokacin sake duba lambar da kuma kafin tura. Wannan mai canza yana gudana a gida a cikin burauzarka don haka asirin Kubernetes, JWT payloads, da tsarins masu sirranci ba su taɓa maɓallinmu.

Menene canzawar JSON ↔ YAML?

JSON (JavaScript Object Notation, RFC 8259) tsari ne mai ƙarfi, da kewaye don bayanai masu tsari; YAML (YAML Ain't Markup Language, sigar 1.2) rubutun JSON ne wanda ke amfani da shinge, layin karye, da syntax mai karatu ga mutum don ƙirar ƙima guda ɗaya. Canza tsakaninsu yana bawa ka damar juyar da tsari guda ɗaya tsakanin siffa mai kyau ga injina (JSON don API, tabbatarwa ta tsari, canza da shirye-shirye) da siffa mai kyau ga mutum (YAML don sake duba lambar, manifests na Kubernetes, ayyukan GitHub Actions) ba tare da sake rubuta makulli guda ɗaya ba.

Yadda canzawar JSON ↔ YAML ke aiki?

Kowane canzawa yana gudana a gida a cikin burauzarka ta amfani da ɗakin karatu na js-yaml da aka haɗa (MIT, sigar 4.1.0). Matakai mafi girma sune:

  1. Mai zaɓin yanayi (Gano ta atomatik / JSON → YAML / YAML → JSON) yana yanke shawarar wane layin samarwa ke gudana. A yanayin Gano ta atomatik harafi na farko maras sarari na shigarwa yana zaɓar alkibla — { ko [ na nufin JSON; duk wani abu yana nufin YAML.
  2. JSON → YAML: JSON.parse yana tabbatar da shigarwa kuma yana samar da ƙimar JavaScript; jsyaml.dump(value, { indent, lineWidth: -1, sortKeys: false }) yana rubuta siffa ta YAML 1.2. Tare da Takardu da yawa a kan, ana buga array na shigarwa abu ɗaya kowace takarda kuma ana haɗa da masu raba ---.
  3. YAML → JSON: jsyaml.loadAll yana bincike kowane takarda a cikin shigarwa (yana sarrafa masu raba --- ta atomatik) zuwa array; ana cire rarraben shigarwa na takarda ɗaya don fitarwar JSON ta zama takarda kanta, ba array na abu ɗaya ba.
  4. Shinge (sarari 2 ko 4) da Buga da kyau ana iya tsarawa. Buga da kyau a kashe yana fitar da JSON da aka rage ta JSON.stringify(value) ba tare da sarari ba.
  5. Ana rubuta fitarwa zuwa yankin rubutu mai karatu-kawai. A kan kuskuren bincike na YAML, sako na kuskure ya haɗa da layin indexed-1 da ginshiƙin da js-yaml's e.mark ya rahoto don ka iya tsalle kai tsaye zuwa kwaro.

Me ya sa canza JSON da YAML da wannan kayan aiki?

  • Sirri: kowane bincike, canza, da fitar da wucewar yana gudana a cikin burauzarka. Bayanai — ciki har da asirin Kubernetes, JWTs masu sanya hannu, da tsarins masu sirranci — ba su taɓa maɓallinmu.
  • YAML mai takardu da yawa: jsyaml.loadAll yana gane masu raba --- kuma yana dawo da array na takardu, wanda mai canza yana cire don lokuta na takarda ɗaya ko adana a matsayin array na JSON don lokuta na takardu da yawa.
  • Ana warware anchors da aliases: an sarrafa tsarin &anchor / *alias na YAML ta hanyar tsarin asali na js-yaml. Ƙima da aka bayyana sau ɗaya kuma aka ambaci sau biyu tana tafiya zuwa gida zuwa abin JSON inda nassoshi duk ke ɗaukar ƙimami daidai.
  • Babu CDN, babu telemetry: ana aika ɗakin karatu na js-yaml.min.js daga asalin guda ɗaya kamar shafin, don haka kayan aikin yana aiki ba tare da intanet ba, a bayan proxy na kamfani, da a cikin muhallin da aka keɓe.

Menene ayyukan gari na canzawar JSON ↔ YAML?

Juyar tsakanin JSON da YAML yana bayyana a duk DevOps, injiniyan dandali, da kayan aikin API:

  • Manifests na Kubernetes: canza YAML na Deployment, ConfigMap, ko HelmRelease zuwa JSON don mai tabbatarwa manufar cikin gida (Joi, Ajv, OPA Rego) ya iya duba shi ta shirye-shirye, sannan baya zuwa YAML don amfani da cluster.
  • Ayyukan CI/CD: tafiya zuwa gida ta GitHub Actions workflow.yml ta JSON don mai ƙirƙirar lambar ya iya sake rubuta matrix ko dogaran ayyuka, sannan fitar da YAML da aka tsabtace don PR.
  • Takardu na OpenAPI: liƙa JSON na openapi.json daga takardun da aka ƙirƙira ta atomatik na backend kuma canza zuwa openapi.yaml don nassoshi da aka gyara da hannu da aka bincika cikin repo.

Yaya misali na tafiyar zuwa gida ta JSON ↔ YAML ke kama?

Liƙa {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"name":"web"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"web"}}}} kuma danna CANZA a yanayin JSON → YAML yana samar da layi takwas na YAML mai shinge tare da apiVersion: apps/v1 a layin farko. Ciyar da YAML ɗin baya a yanayin YAML → JSON tare da Buga da kyau a kan yana dawo da abin asali byte-zuwa-byte bayan JSON.stringify(value, null, 2) mai tsauri, tare da tsarin makulli da aka adana saboda tsarin asali na js-yaml yana girmama tsarin shigarwa a alkiblu biyu.

Shin wannan mai canza JSON ↔ YAML yana gudana gaba ɗaya a cikin burauzarki?

Eh. Kowane bincike, canza, da fitar da wucewar yana gudana a gida a matsayin JavaScript a cikin taba burauzarka. Ɗakin karatu na js-yaml da aka haɗa yana aika daga asalin guda ɗaya kamar shafi — babu CDN, babu fetch, babu XMLHttpRequest, babu navigator.sendBeacon akan shigarwa. Kayan aikin kuma yana aiki ba tare da intanet ba da zarar an loda shafin, saboda ɗumbin HTML/CSS/JS ne mai tsauri tare da ɗakin karatu na vendor da aka kwafi a gefen shi. Asirin Kubernetes, JWT payloads, CloudFormation YAMLs masu sanya hannu, da tsarins masu sirranci suna zama a na'urar ka.

Yaya mai canza ke sarrafa YAML mai takardu da yawa?

YAML yana goyan bayan takardu da yawa a cikin rafi ɗaya da aka raba da layi da ke ƙunshe da --- kawai. A YAML → JSON mai canza yana kiran jsyaml.loadAll, wanda yana dawo da kowane takarda a matsayin ƙimart JavaScript. Idan daidai takarda ɗaya aka samu fitarwar JSON ita ce wannan takarda kai tsaye; idan biyu ko fiye aka samu fitarwar JSON array ne. A JSON → YAML, lokacin da shigarwa array na JSON ce DA mabuɗin Takardu da yawa a kan, ana buga kowane abu na array a matsayin nawa takarda tare da masu raba --- tsakaninsu — yana da amfani don ƙirƙirar ɗumbi mai kyau na kubectl apply daga array na JSON na albarkatu.

Shin ana goyan bayan anchors da aliases na YAML?

Eh — ana warware ma'anonin &anchor da nassoshin *alias ta hanyar tsarin asali na js-yaml a lokacin mataki na loda. Shigarwar YAML kamar defaults: &d\n retries: 3\n timeout: 30\njob_a:\n <<: *d\njob_b:\n <<: *d yana bincike zuwa abin JSON inda job_a da job_b dukansu ke ƙunshe da retries: 3, timeout: 30. An kuma goyan bayan makullin haɗawa << (faɗaɗawa ta YAML 1.1 wanda js-yaml har yanzu yana girmama shi) akan tsarin asali.

Ana adana sharhin YAML lokacin canza zuwa JSON da baya?

A'a — js-yaml yana cire sharhi a lokacin mataki na bincike, don haka tafiyar zuwa gida ta YAML → JSON → YAML za ta rasa duk layi masu prefix na #. Wannan iyaka ce da aka sani ta ƙirar loda/buga; idan adana sharhi yana da mahimmanci, yi amfani da ɗakin karatu mai sani na sharhi kamar kunshin npm na yaml (wanda yana aika CST + AST API wanda aka tsara don adana trivia) maimakon js-yaml. Don yawancin ayyukan canza tsari, musayar ta yarda: YAML da aka tafiya zuwa gida yana adana kowane makulli, ƙima, anchor, da alias, kuma ba tare da sharhin da mutum ya rubuta ba.

Menene ke faruwa ga tags na al'ada na YAML?

Mai canza yana amfani da DEFAULT_SCHEMA na js-yaml, wanda yana fahimtar !!str, !!int, !!float, !!bool, !!null, !!seq, !!map, !!binary, da !!timestamp — kowane tag a cikin tsarin YAML 1.2 na asali da JSON. Tags na al'ada ko na aikace-aikace (misali !Ref a CloudFormation, !vault a Ansible) ba a gane su ba kuma suna fitowa a matsayin kuskure mai bayyanawa yana ambaci tag da ba a goyan bayan ba. Don CloudFormation musamman, yi amfani da aws cloudformation package + --output-template-file don faɗaɗa tags na al'ada kafin liƙa cikin wannan mai canza.

Wannan mai canza JSON ↔ YAML yana aika js-yaml@4.1.0 da aka haɗa a asalin guda ɗaya, yana goyan bayan rafi na takardu da yawa da anchors/aliases kai tsaye daga akwatin, kuma yana rahoto kuskuren bincike na YAML tare da layi da ginshiƙi don ka iya gyara tushe. Babu loda, babu CDN, babu telemetry — kowane byte yana zama a cikin burauzarka.