§

Bandika JSON au YAML unayotaka kubadilisha.

Hali
Mwachano
Chaguzi
§

Matokeo

yaml

Kubadilisha kati ya JSON na YAML ni kazi ya kila siku kwa timu za majukwaa Afrika Mashariki. Manifests za Kubernetes kwa AWS EKS zinaandikwa kwa YAML lakini zinatekelezwa kama JSON ndani, na mfululizo wa CI/CD ukitumia GitHub Actions unahusisha kubadilisha muundo mara kwa mara. Timu za fintech za Afrika Mashariki hubadilisha tofauti za Open Banking JSON dhidi ya vifaa vya YAML, huku timu za DevOps zikibadilisha usanidi wa Helm kutoka YAML hadi JSON kwa uthibitisho wa schema kabla ya kutuma. Kibadilishaji hiki kinaendesha kila ubadilishaji nchini kwenye kivinjari chako.

Ubadilishaji wa JSON ↔ YAML ni nini?

JSON (JavaScript Object Notation, RFC 8259) ni muundo wa maandishi mkali unaopakana na vifungo kwa data iliyopangwa; YAML (YAML Ain't Markup Language, toleo 1.2) ni superset ya JSON inayotumia mwachano, mapumziko ya mstari, na sintaksia inayosomeka na binadamu kwa modeli ile ile ya thamani. Kubadilisha kati yao hukuruhusu kubadilisha usanidi ule ule kati ya fomu ya kirafiki kwa mashine (JSON kwa API, uthibitisho wa schema, mabadiliko ya kisanidi) na fomu ya kirafiki kwa binadamu (YAML kwa ukaguzi wa msimbo, manifests za Kubernetes, mifumo ya GitHub Actions) bila kuandika upya funguo moja.

Ubadilishaji wa JSON ↔ YAML unafanya kazi vipi?

Kila ubadilishaji hufanyika nchini kwenye kivinjari chako ukitumia maktaba ya js-yaml iliyofungwa (MIT, toleo 4.1.0). Hatua kuu ni:

  1. Kichaguzi cha hali (Tambua kiotomati / JSON → YAML / YAML → JSON) kinaamua mfululizo unaofanya kazi. Katika hali ya Tambua kiotomati tabia ya kwanza isiyo nafasi ya ingizo huchagua mwelekeo — { au [ inamaanisha JSON; chochote kingine kinamaanisha YAML.
  2. JSON → YAML: JSON.parse inathibitisha ingizo na kuzalisha thamani ya JavaScript; jsyaml.dump(value, { indent, lineWidth: -1, sortKeys: false }) inaandika fomu ya YAML 1.2. Ukiwa na Hati nyingi imewashwa, safu wima ya ingizo hutolewa kipengele kimoja kwa kila hati na kuunganishwa na vitenganishi vya ---.
  3. YAML → JSON: jsyaml.loadAll inachambua kila hati katika ingizo (kushughulikia vitenganishi vya --- kiotomati) kuwa safu wima; maingizo ya hati moja yanaungwa mkono ili matokeo ya JSON yawe hati yenyewe, si safu wima ya kipengele kimoja.
  4. Mwachano (nafasi 2 au 4) na Chapisha kwa usafi vinaweza kusanidiwa. Chapisha kwa usafi imezimwa hutoa JSON dogo kupitia JSON.stringify(value) bila nafasi.
  5. Matokeo yanaandikwa kwenye eneo la maandishi la kusomwa-tu. Kwa kushindwa kwa uchambuzi wa YAML, ujumbe wa hitilafu unajumuisha mstari wa faharasa 1 na safu ulioripotiwa na e.mark ya js-yaml ili uweze kuruka moja kwa moja kwa hitilafu.

Kwa nini ubadilishe JSON na YAML na zana hii?

  • Faragha: kila upitio wa uchambuzi, ubadilishaji, na utoaji hufanyika kwenye kivinjari chako. Data — ikijumuisha siri za Kubernetes, JWT zilizosainiwa, na usanidi wa siri — haifiki seva zetu kamwe.
  • YAML ya hati nyingi: jsyaml.loadAll inatambua vitenganishi vya --- na kurejesha safu wima ya hati, ambayo kibadilishaji kinaungua kwa hali za hati moja au kuhifadhi kama safu wima ya JSON kwa hali za hati nyingi.
  • Nanga na nyama zimetatatua: mfumo wa &nanga / *nyama wa YAML unashughulikiwa na schema ya chaguo-msingi ya js-yaml. Thamani iliyofafanuliwa mara moja na kurejelewa mara mbili husafiri mzunguko hadi kitu cha JSON ambapo marejeleo yote yana thamani sawa.
  • Hakuna CDN, hakuna telemetri: maktaba ya js-yaml.min.js inasafirisha kutoka asili ile ile kama ukurasa, kwa hivyo zana hufanya kazi nje ya mtandao, nyuma ya wakala wa kampuni, na ndani ya mazingira yaliyofungwa.

Matumizi ya kawaida ya ubadilishaji wa JSON ↔ YAML ni yapi?

Kubadilisha kati ya JSON na YAML kunaonekana katika DevOps, uhandisi wa majukwaa, na zana za API:

  • Manifests za Kubernetes: kubadilisha Deployment, ConfigMap, au HelmRelease ya YAML kuwa JSON ili mthibitishaji wa sera wa ndani (Joi, Ajv, OPA Rego) aweze kuirekebisha kisanidi, kisha kurudi kuwa YAML kwa kutumika kwa nguzo.
  • Mifumo ya CI/CD: kusafirisha mzunguko wa workflow.yml ya GitHub Actions kupitia JSON ili kizalishi cha msimbo kiweze kuandika upya matrix au utegemezi wa kazi, kisha kutoa YAML iliyosafishwa kwa PR.
  • Uainishi wa OpenAPI: kubandika openapi.json ya JSON kutoka kwa nyaraka zinazozalishwa kiotomati za backend na kubadilisha kuwa openapi.yaml kwa marejeleo yaliyoharirwa na binadamu yaliyoingizwa kwenye hifadhi.

Mfano wa safari ya mzunguko ya JSON ↔ YAML unaonekanaje?

Kubandika {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"name":"web"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"web"}}}} na kubonyeza BADILISHA katika hali ya JSON → YAML kunazalisha mistari nane ya YAML iliyowekwa mwachano na apiVersion: apps/v1 kwenye mstari wa kwanza. Kulisha YAML hiyo tena katika hali ya YAML → JSON na Chapisha kwa usafi imewashwa kunarudisha kitu asili byte kwa byte baada ya JSON.stringify(value, null, 2) thabiti, na mpangilio wa funguo ukihifadhiwa kwa sababu schema ya chaguo-msingi ya js-yaml inakubali mpangilio wa uingizaji katika mwelekeo wote wawili.

Je, kibadilishaji hiki cha JSON ↔ YAML kinafanya kazi kabisa kwenye kivinjari changu?

Ndiyo. Kila upitio wa uchambuzi, ubadilishaji, na utoaji hufanyika nchini kama JavaScript ndani ya kichupo cha kivinjari chako. Maktaba ya js-yaml iliyofungwa inasafirisha kutoka asili ile ile kama ukurasa — hakuna CDN, hakuna fetch, hakuna XMLHttpRequest, hakuna navigator.sendBeacon kwenye ingizo. Zana pia inafanya kazi nje ya mtandao baada ya ukurasa kupakia, kwa sababu ni kifurushi cha statiki cha HTML/CSS/JS na maktaba ya muuzaji iliyonakiliwa karibu nake. Siri za Kubernetes, mzigo wa JWT, YAML za CloudFormation zilizosainiwa, na usanidi wa siri hubaki kwenye kifaa chako.

Kibadilishaji kinashughulikia YAML ya hati nyingi vipi?

YAML inasaidia hati nyingi katika mkondo mmoja zilizotengwa na mistari iliyo na --- tu. Katika YAML → JSON kibadilishaji kinaita jsyaml.loadAll, ambacho kinarudisha kila hati kama thamani ya JavaScript. Ikiwa hati moja tu inapatikana matokeo ya JSON ni hati hiyo moja kwa moja; ikiwa mbili au zaidi zinapatikana matokeo ya JSON ni safu wima. Katika JSON → YAML, wakati ingizo ni safu wima ya JSON NA kitufe cha Hati nyingi kimewashwa, kila kipengele cha safu wima hutolewa kama hati yake na vitenganishi vya --- kati yao — inafaa kwa kuzalisha kifurushi cha kirafiki cha kubectl apply kutoka kwa safu wima ya JSON ya rasilimali.

Je, nanga na nyama za YAML zinasaidiwa?

Ndiyo — ufafanuzi wa &nanga na marejeleo ya *nyama yanatutatuliwa na schema ya chaguo-msingi ya js-yaml wakati wa hatua ya kupakia. Ingizo la YAML kama defaults: &d\n retries: 3\n timeout: 30\njob_a:\n <<: *d\njob_b:\n <<: *d linachambulika hadi kitu cha JSON ambapo job_a na job_b zote zina retries: 3, timeout: 30. Funguo ya kuunganisha << (kiendelezi cha YAML 1.1 ambacho js-yaml bado inakubali) pia inasaidiwa kwenye schema ya chaguo-msingi.

Je, maoni ya YAML yanahifadhiwa wakati wa kubadilisha hadi JSON na kurudi?

Hapana — js-yaml huondoa maoni wakati wa hatua ya uchambuzi, kwa hivyo safari ya mzunguko ya YAML → JSON → YAML itapoteza kila mstari ulioandika #. Hii ni kikwazo kinachojulikana cha modeli ya pakia/toa; ikiwa kuhifadhi maoni ni muhimu, tumia maktaba inayojua maoni kama pakiti ya `yaml` ya npm (ambayo inasafirisha CST + API ya AST iliyoundwa kuhifadhi maoni) badala ya js-yaml. Kwa mifumo ya kawaida ya ubadilishaji wa usanidi mabadiliko hayo yanakubalika: YAML iliyosafiri mzunguko inaweka kila funguo, thamani, nanga, na nyama, tu bila maoni yaliyoandikwa na binadamu.

Lebo za YAML za kawaida zinatokea nini?

Kibadilishaji kinatumia DEFAULT_SCHEMA ya js-yaml, ambayo inaelewa !!str, !!int, !!float, !!bool, !!null, !!seq, !!map, !!binary, na !!timestamp — kila lebo katika msingi wa YAML 1.2 na schema za JSON. Lebo za kawaida au maalum ya programu (mfano !Ref katika CloudFormation, !vault katika Ansible) hazitambuliwi na zinaonekana kama hitilafu wazi ikitaja lebo isiyosaidiwa. Kwa CloudFormation hasa, tumia mtiririko wa aws cloudformation package + --output-template-file kupanua lebo za kawaida kabla ya kubandika kwenye kibadilishaji hiki.

Kibadilishaji hiki cha JSON ↔ YAML kinasafirisha na js-yaml@4.1.0 kilichofungwa kwenye asili ile ile, kinasaidia mikondo ya hati nyingi na nanga/nyama bila kuandika ziada, na kuripoti makosa ya uchambuzi wa YAML na mstari na safu ili uweze kurekebisha chanzo. Hakuna kupakia, hakuna CDN, hakuna telemetri — kila byte inabaki kwenye kivinjari chako.