Att parsa JSON i JavaScript är något du kommer göra hundratals gånger som webbutvecklare. Lyckligtvis har JavaScript inbyggt stöd för det — inga bibliotek behövs. Men det finns fler nyanser kring JSON.parse() och JSON.stringify() än vad dokumentationen avslöjar. Låt oss gå igenom det ordentligt.

JSON.parse() — göra om en sträng till ett objekt

JSON.parse() tar en JSON-formaterad sträng och konverterar den till ett JavaScript-värde. Det värdet är vanligtvis ett objekt eller en array, men det kan också vara en sträng, ett tal, ett booleskt värde eller null:

js
const jsonString = '{"name": "Alice", "age": 30, "active": true}';
const user = JSON.parse(jsonString);

console.log(user.name);    // "Alice"
console.log(user.age);     // 30
console.log(user.active);  // true
console.log(typeof user);  // "object"

Notera att indata måste vara en sträng. Ett vanligt misstag är att försöka parsa ett värde som redan är ett objekt — JSON.parse({}) kastar ett SyntaxError eftersom det konverterar objektet till "[object Object]" först, vilket inte är giltig JSON.

Omslut alltid JSON.parse() i ett try/catch

Det här är något ingen berättar för dig: JSON.parse() kastar ett SyntaxError om indata är ogiltig JSON. Om du parsar data från ett API, användarinput eller en fil bör du alltid hantera det felet. Ett enda felformat svar kan krascha din app om du inte gör det:

js
function safeParseJSON(str) {
  try {
    return { data: JSON.parse(str), error: null };
  } catch (err) {
    return { data: null, error: err.message };
  }
}

const { data, error } = safeParseJSON('{"name": "Alice"}');
if (error) {
  console.error('Invalid JSON:', error);
} else {
  console.log(data.name); // "Alice"
}

// Handles bad input gracefully
const result = safeParseJSON('not json at all');
console.log(result.error); // "Unexpected token 'o', "not json "... is not valid JSON"

Jag använder en wrapper som den här i nästan varje projekt. Den gör felhanteringen konsekvent och förhindrar fula oupptäckta undantag från att bubbla upp till ditt UI.

JSON.stringify() — göra om ett objekt till en sträng

JSON.stringify() gör det omvända: den konverterar ett JavaScript-värde till en JSON-sträng. Du använder detta när du skickar data till ett API, sparar till localStorage eller skriver till en fil:

js
const user = {
  name: "Bob",
  age: 25,
  roles: ["admin", "editor"],
  password: "secret123" // we'll handle this later
};

// Basic usage
const jsonString = JSON.stringify(user);
// '{"name":"Bob","age":25,"roles":["admin","editor"],"password":"secret123"}'

// Pretty-printed (great for logs and file output)
const prettyJson = JSON.stringify(user, null, 2);
console.log(prettyJson);
// {
//   "name": "Bob",
//   "age": 25,
//   "roles": ["admin", "editor"],
//   "password": "secret123"
// }

Det tredje argumentet till JSON.stringify() är indragsnivån. Att använda 2 eller 4 ger läsbar utmatning. Standardinställningen (inget tredje argument) ger kompakt, minifierad JSON — bättre för nätverksöverföring.

Vad stringify() tyst utelämnar

Det här biter utvecklare regelbundet. JSON.stringify() utelämnar tyst vissa värden eftersom JSON inte stöder dem:

js
const data = {
  name: "Alice",
  greet: function() { return "hi"; },   // Functions → dropped
  undef: undefined,                      // undefined → dropped
  sym: Symbol("key"),                    // Symbols → dropped
  nan: NaN,                              // NaN → null
  inf: Infinity,                         // Infinity → null
  date: new Date("2024-01-15")           // Dates → ISO string
};

console.log(JSON.stringify(data, null, 2));
// {
//   "name": "Alice",
//   "nan": null,
//   "inf": null,
//   "date": "2024-01-15T00:00:00.000Z"
// }
// greet, undef, sym are GONE
Se upp: Om du stringifierar ett objekt med undefined-värden och sedan parsar det, kommer de nycklarna att saknas helt. Det kan orsaka subtila buggar om din kod senare kontrollerar obj.key === undefined.

Hämta JSON från ett API — det verkliga mönstret

I praktiken sker de flesta JSON-parsningar när du hämtar data från ett API. Fetch API gör det enkelt — response.json() hanterar parsningen åt dig:

js
async function getUser(userId) {
  try {
    const response = await fetch(`https://api.example.com/users/${userId}`);

    if (!response.ok) {
      throw new Error(`HTTP error: ${response.status}`);
    }

    const user = await response.json(); // parses JSON automatically
    return user;
  } catch (err) {
    console.error('Failed to fetch user:', err);
    return null;
  }
}

const user = await getUser(42);
if (user) {
  console.log(`Hello, ${user.name}!`);
}

response.json() är i princip JSON.parse(await response.text()). Det kastar också om svarets kropp inte är giltig JSON, så det är värt att fånga det separat i produktionskod.

Jobba med nästlad JSON-data

Djupt nästlad JSON är vanligt i verkliga API:er. Så här navigerar du den säkert utan att krascha på saknade nycklar:

js
const apiResponse = {
  "user": {
    "profile": {
      "address": {
        "city": "Berlin"
      }
    }
  }
};

// Unsafe — throws if any level is undefined
const city1 = apiResponse.user.profile.address.city; // "Berlin"

// Safe with optional chaining (ES2020+) — returns undefined instead of throwing
const city2 = apiResponse?.user?.profile?.address?.city; // "Berlin"
const zip   = apiResponse?.user?.profile?.address?.zip;  // undefined (not a crash)

// With a fallback using nullish coalescing
const country = apiResponse?.user?.profile?.address?.country ?? "Unknown";

Optional chaining (?.) och nullish coalescing (??) är moderna JavaScript-funktioner — båda en del av ECMAScript-specifikationen sedan 2020 — som gör det mycket säkrare att jobba med osäkra JSON-strukturer. Använd dem fritt — de stöds i alla moderna webbläsare och Node.js 14+.

Funktionerna replacer och reviver

Både JSON.stringify() och JSON.parse() accepterar ett andra argument som låter dig anpassa transformationen. De är genuint användbara i verkliga scenarier:

js
// replacer: filter or transform values during stringify
const user = { name: "Alice", password: "s3cr3t", age: 30 };
const safe = JSON.stringify(user, ["name", "age"]); // only include these keys
// '{"name":"Alice","age":30}'  — password is excluded

// reviver: transform values during parse
const dateJson = '{"name": "Alice", "createdAt": "2024-01-15T09:30:00Z"}';
const parsed = JSON.parse(dateJson, (key, value) => {
  if (key === "createdAt") return new Date(value); // convert string to Date
  return value;
});
console.log(parsed.createdAt instanceof Date); // true
console.log(parsed.createdAt.getFullYear());   // 2024

Reviver-mönstret är särskilt användbart för att återställa Date-objekt efter en tur-och-retur genom JSON, eftersom JSON inte har en inbyggd datumtyp.

Användbara verktyg

När du jobbar med JSON i JavaScript-projekt sparar dessa verktyg tid: JSON Formatter för att pretty-printa minifierade API-svar, JSON Validator för att kontrollera syntaxfel, JSON Path för att fråga specifika fält från stora payloads, och JSON Escape när du behöver bädda in JSON i en sträng. För mer djup är MDN JSON-referensen utmärkt.

Avslutningsvis

JSON.parse() och JSON.stringify() är de två funktioner du behöver. Nyckelvanorna att bygga: omslut alltid parse() i try/catch, använd optional chaining för nästlad åtkomst, och vet vad stringify() tyst utelämnar. Bemästra de tre och du hanterar 99% av verkliga JSON-scenarier utan överraskningar.