JSON Stringify / Unstringify

Escape een JSON-object naar een enkelregelige, aanhalingsteken-geëscapete stringliteral om in code in te bedden, of unescape een gestringifyde JSON-string terug naar leesbare JSON.

1.006 weergaven

Hoe het werkt

Stringify neemt echte JSON en escapet deze naar een enkelregelige, aanhalingsteken-geëscapete stringliteral — de vorm die u nodig heeft om JSON in te bedden in een ander JSON-veld, een configuratiewaarde of een string-constante in broncode. Intern is dit precies wat JavaScripts JSON.stringify() doet: het doorloopt de waarde, zet strings tussen aanhalingstekens, escapet controletekens en ingesloten aanhalingstekens, en serialiseert objecten en arrays naar tekst. Unstringify doet het omgekeerde: plak een geëscapete JSON-string (met \" en \n) en krijg schone, leesbare, ingesprongen JSON terug — gelijk aan JSON.parse() erop toepassen en het resultaat netjes opmaken.

Concreet voorbeeld: het object {"name":"Ada","tags":["a","b"]} wordt gestringifyd tot de letterlijke tekst "{\"name\":\"Ada\",\"tags\":[\"a\",\"b\"]}" — elk binnenste dubbel aanhalingsteken krijgt een backslash ervoor, zodat het geheel binnen één buitenste paar aanhalingstekens kan bestaan. Dit is precies wat er gebeurt wanneer een API een JSON-payload als string in een andere JSON-respons verpakt (een webhook-body, een logregel, een databasekolom van het type text), of wanneer een JSON-waarde in een YAML-bestand, een omgevingsvariabele of een string-constante in broncode moet worden geplaatst zonder de omringende syntax te breken. Unstringify doet het omgekeerde: plak die geëscapete brij en krijg het origineel terug, ingesprongen en leesbaar.

Een paar gedragingen van JSON.stringify() zijn de moeite waard om te kennen, ook als u deze exacte tool nooit gebruikt: undefined-waarden en functies worden stilzwijgend weggelaten uit objecteigenschappen (een sleutel met de waarde undefined verdwijnt gewoon), maar diezelfde waarden binnen een array worden omgezet naar null in plaats van weggelaten, omdat arrays hun lengte en indexposities intact moeten houden. Date-objecten worden niet als object geserialiseerd — ze worden via hun toJSON()-methode omgezet naar een ISO 8601-string zoals "2024-01-15T10:30:00.000Z". En een waarde met een circulaire referentie — een object dat (rechtstreeks of via een keten van eigenschappen) naar zichzelf verwijst — kan helemaal niet worden gestringifyd: de echte JSON.stringify() gooit een TypeError: Converting circular structure to JSON, omdat er geen eindige string bestaat die een oneindig geneste structuur zou kunnen weergeven.

Wat u moet weten

Stringifyen is in één specifiek opzicht een lossy bewerking: alles wat stilzwijgend wordt weggelaten (functies, undefined-eigenschappen, Symbol-sleutels) kan achteraf niet worden teruggehaald door te unstringifyen — de heen-en-terugreis behoudt alleen wat geldige JSON sowieso kan weergeven, namelijk strings, getallen, booleans, null, gewone objecten en arrays. In echte code accepteert JSON.stringify() ook nog twee extra argumenten naast de waarde zelf: een replacer (een functie of array van sleutelnamen die precies bepaalt welke eigenschappen worden meegenomen, of hoe hun waarden worden getransformeerd vóór het serialiseren), en een space-parameter (een getal of string die de compacte, enkelregelige uitvoer omzet naar ingesprongen, leesbare JSON — dit is precies het verschil tussen een geminificeerde API-respons en de netjes opgemaakte versie die een debugger u toont).

Dubbel gecodeerde JSON is een veelvoorkomende bron van verwarring: als een waarde eruitziet als een JSON-string, maar het allereerste teken een aanhalingsteken is en de string vol staat met backslash-geëscapete binnenste aanhalingstekens, is deze waarschijnlijk twee keer gestringifyd — één keer door de applicatie, nog een keer door een laag die niet doorhad dat de payload al een JSON-string was. Er één keer unstringify op toepassen lost de buitenste laag op; als het resultaat er nog steeds geëscapet uitziet, voer het dan opnieuw uit.

Veelgestelde vragen

Wat is het verschil met JSON.stringify in code?

Dezelfde bewerking, maar als interactieve tool: plak echte JSON, krijg de geëscapete stringvorm die u anders zou produceren met JSON.stringify(obj) — handig wanneer u geen console bij de hand heeft.

Waarom zou ik JSON moeten unstringifyen?

API's en logs nestelen soms een JSON-string binnen een JSON-veld (dubbel gecodeerde JSON) — unstringify zet die interne geëscapete string terug om naar leesbare, parseerbare JSON.

Waarom verdween een eigenschap na het stringifyen?

JSON.stringify() laat objecteigenschappen waarvan de waarde undefined of een functie is, stilzwijgend weg — voor geen van beide bestaat een JSON-representatie, dus de sleutel wordt volledig verwijderd in plaats van als null geserialiseerd. Dezelfde undefined-waarde binnen een array wordt omgezet naar null in plaats van te verdwijnen, omdat arrays hun lengte en indexvolgorde moeten behouden.

Waarom krijg ik een foutmelding over een "circular structure"?

Als een object rechtstreeks of via een keten van andere objecten naar zichzelf verwijst, kan JSON.stringify() er geen eindige string voor produceren en gooit het een TypeError. Dit komt vaak voor bij het serialiseren van objecten met een terugverwijzing naar hun ouder (een childnode die terugwijst naar zijn boomstructuur, een DOM-element, een class-instantie met een "self"-veld) — de oplossing is de circulaire eigenschap vóór het serialiseren te verwijderen of te vervangen, vaak met een replacer-functie.

Worden mijn gegevens geüpload?

Nee — beide richtingen werken lokaal in uw browser.

Reacties

Nog geen reacties — schrijf de eerste!

Vergelijkbare tools