Back to Blog

Why JSON.stringify() Returns Undefined (And How to Fix It)

Complete Guide to Fixing JSON.stringify() Undefined Issues (2026)

Definition: What Does JSON.stringify() Returning Undefined Mean?

JSON.stringify() returning undefined occurs when the method cannot convert a value to a JSON string, or when undefined values are encountered during serialization. JSON.stringify() has specific behavior with undefined values: it omits undefined properties from objects and returns undefined when trying to stringify the undefined value itself.

When JSON.stringify() encounters undefined, it behaves differently depending on the context: undefined properties in objects are omitted entirely, undefined values in arrays are converted to null, and stringifying undefined directly returns undefined (not a string). This behavior is by design, as undefined is not a valid JSON value according to the JSON specification.

Understanding why JSON.stringify() returns undefined is crucial for debugging serialization issues, handling optional data, and ensuring data integrity when converting JavaScript objects to JSON strings. The method's behavior with undefined values can lead to unexpected results if not properly understood and handled.

Key Point: JSON.stringify() omits undefined properties and cannot stringify undefined values because undefined is not part of the JSON specification. This is intentional behavior, not a bug. Use replacer functions or preprocessing to handle undefined values.

What: Understanding JSON.stringify() Undefined Behavior

JSON.stringify() handles undefined in specific ways:

Undefined Properties

When an object property is undefined, JSON.stringify() omits it from the output. This is because undefined is not a valid JSON value. The property simply doesn't appear in the resulting JSON string.

Example: { "name": "John", "age": undefined } becomes { "name": "John" }

Undefined Values

When you try to stringify undefined directly, JSON.stringify(undefined) returns undefined (not the string "undefined"). In arrays, undefined values are converted to null, which is a valid JSON value.

Example: JSON.stringify([1, undefined, 3]) returns "[1,null,3]"

Replacer Function

If a replacer function returns undefined, that property is omitted from the output. This allows you to filter out unwanted properties. The replacer function can transform undefined values to null or other values.

Replacer: (key, value) => value === undefined ? null : value

Circular References

When objects contain circular references, JSON.stringify() throws a TypeError. This is different from returning undefined, but it prevents stringification. Circular references must be handled separately.

Circular: obj.self = obj causes TypeError

Important: JSON.stringify() behavior with undefined is intentional and follows the JSON specification. Undefined is not a valid JSON value, so it's omitted or converted. Understanding this behavior helps you handle data serialization correctly.

When: When Does JSON.stringify() Return Undefined?

JSON.stringify() returns undefined in these situations:

Stringifying Undefined Directly

When you call JSON.stringify(undefined), it returns undefined (not a string). This is because undefined cannot be represented in JSON format. Always check if a value is undefined before stringifying it.

Objects with Undefined Properties

When an object contains undefined properties, those properties are omitted from the JSON output. This can cause issues if you expect all properties to be present in the serialized JSON.

Replacer Function Returns Undefined

When a replacer function returns undefined for a property, that property is excluded from the output. This is useful for filtering properties, but can cause confusion if unintentional.

Optional or Missing Data

When working with optional fields or data that may be missing, undefined values can appear. JSON.stringify() will omit these, potentially causing issues if the receiving system expects all fields.

Common Scenario: JSON.stringify() returns undefined most commonly when stringifying undefined directly, or when objects contain undefined properties that get omitted. This is normal behavior, but can cause issues if not handled properly.

How To: Fix JSON.stringify() Undefined Issues

Follow these methods to fix JSON.stringify() undefined issues:

Method 1: Use Replacer Function to Convert Undefined to Null

Convert undefined values to null before stringifying:

Basic Replacer Function

const obj = {
  name: 'John',
  age: undefined,
  city: 'New York'
};

// Convert undefined to null
const jsonString = JSON.stringify(obj, (key, value) => {
  return value === undefined ? null : value;
});

console.log(jsonString);
// Output: {"name":"John","age":null,"city":"New York"}

Reusable Function

function stringifyWithNull(obj) {
  return JSON.stringify(obj, (key, value) => {
    return value === undefined ? null : value;
  });
}

const obj = { name: 'John', age: undefined };
const json = stringifyWithNull(obj);
// {"name":"John","age":null}

Method 2: Filter Out Undefined Properties

Remove undefined properties before stringifying:

Remove Undefined Properties

const obj = {
  name: 'John',
  age: undefined,
  city: 'New York'
};

// Remove undefined properties
const cleaned = Object.fromEntries(
  Object.entries(obj).filter(([key, value]) => value !== undefined)
);

const jsonString = JSON.stringify(cleaned);
console.log(jsonString);
// Output: {"name":"John","city":"New York"}

Recursive Function for Nested Objects

function removeUndefined(obj) {
  if (Array.isArray(obj)) {
    return obj.map(removeUndefined).filter(item => item !== undefined);
  } else if (obj !== null && typeof obj === 'object') {
    return Object.fromEntries(
      Object.entries(obj)
        .map(([key, value]) => [key, removeUndefined(value)])
        .filter(([key, value]) => value !== undefined)
    );
  }
  return obj;
}

const obj = {
  name: 'John',
  age: undefined,
  address: {
    street: '123 Main St',
    zip: undefined
  }
};

const cleaned = removeUndefined(obj);
const jsonString = JSON.stringify(cleaned);
// {"name":"John","address":{"street":"123 Main St"}}

Method 3: Handle Undefined Values in Arrays

Arrays with Undefined Values

// Undefined in arrays becomes null
const arr = [1, undefined, 3];
const jsonString = JSON.stringify(arr);
console.log(jsonString);
// Output: [1,null,3]

// To remove undefined from arrays
const cleaned = arr.filter(item => item !== undefined);
const jsonString2 = JSON.stringify(cleaned);
console.log(jsonString2);
// Output: [1,3]

Method 4: Check for Undefined Before Stringifying

Safe Stringify Function

function safeStringify(obj) {
  if (obj === undefined) {
    return undefined; // or return 'null' or throw error
  }
  
  try {
    return JSON.stringify(obj, (key, value) => {
      if (value === undefined) {
        return null; // Convert undefined to null
      }
      return value;
    });
  } catch (error) {
    if (error instanceof TypeError && error.message.includes('circular')) {
      // Handle circular reference
      return JSON.stringify(obj, (key, value) => {
        if (typeof value === 'object' && value !== null) {
          // Simple circular reference detection
          if (seen.has(value)) {
            return '[Circular]';
          }
          seen.add(value);
        }
        return value === undefined ? null : value;
      });
    }
    throw error;
  }
}

// Usage
const obj = { name: 'John', age: undefined };
const json = safeStringify(obj);
// {"name":"John","age":null}

Method 5: Handle Circular References

Using a Library

// Install: npm install flatted
import { stringify } from 'flatted';

const obj = { name: 'John' };
obj.self = obj; // Circular reference

const jsonString = stringify(obj);
// Handles circular references

// Or use json-stringify-safe
import stringify from 'json-stringify-safe';

const jsonString2 = stringify(obj);
// Replaces circular references with "[Circular]"

Best Practice: Always handle undefined values explicitly. Use replacer functions to convert undefined to null if you need to preserve properties, or filter out undefined properties if they're not needed. Check for undefined before stringifying, and handle circular references appropriately.

Why: Why JSON.stringify() Returns Undefined

JSON.stringify() returns undefined for several important reasons:

JSON Specification

The JSON specification (RFC 8259) only supports null, strings, numbers, booleans, objects, and arrays. Undefined is not part of the JSON specification, so JSON.stringify() cannot include it. This ensures JSON strings are valid and can be parsed by any JSON parser.

Data Integrity

Omitting undefined properties helps maintain data integrity. When undefined values are omitted, the resulting JSON only contains actual data values. This prevents confusion between "property doesn't exist" and "property is undefined".

Cross-Language Compatibility

JSON is designed to be language-agnostic. Since undefined is a JavaScript-specific concept, omitting it ensures JSON can be used across different programming languages that may not have an undefined concept.

Predictable Behavior

The consistent behavior of omitting undefined makes JSON.stringify() predictable. Developers know that undefined properties won't appear in the output, allowing them to handle optional data appropriately using null or omitting properties entirely.

Important: JSON.stringify() behavior with undefined is intentional and follows the JSON specification. This ensures JSON remains valid, language-agnostic, and predictable. Understanding this behavior helps you handle data serialization correctly and avoid unexpected results.

Frequently Asked Questions

Why does JSON.stringify() return undefined?

JSON.stringify() returns undefined when: 1) The value itself is undefined, 2) A property in the object is undefined (undefined properties are omitted), 3) The replacer function returns undefined, 4) There is a circular reference, or 5) The value contains functions or symbols. JSON.stringify() omits undefined values and functions by design because undefined is not a valid JSON value.

How do I fix JSON.stringify() returning undefined?

Use a replacer function to handle undefined values: JSON.stringify(obj, (key, value) => value === undefined ? null : value). Or filter out undefined properties before stringifying. For circular references, use a library like flatted or handle them manually. Always check if the value is undefined before stringifying.

Why are undefined properties omitted in JSON.stringify()?

JSON.stringify() omits undefined properties because undefined is not a valid JSON value. JSON only supports null, strings, numbers, booleans, objects, and arrays. Undefined values are automatically excluded to produce valid JSON. This is by design in the JSON specification (RFC 8259).

Can I include undefined values in JSON.stringify()?

You can convert undefined to null using a replacer function: JSON.stringify(obj, (key, value) => value === undefined ? null : value). This will include the property with a null value instead of omitting it. However, undefined itself cannot be included in JSON as it is not a valid JSON value.

How do I handle circular references in JSON.stringify()?

Use a library like flatted or json-stringify-safe, or implement a custom replacer function that tracks visited objects using a WeakSet. Circular references cause JSON.stringify() to throw a TypeError. You can detect circular references and replace them with a placeholder value like "[Circular]".

Share this article with Your Friends, Collegue and Team mates

Stay Updated

Get the latest tool updates, new features, and developer tips delivered to your inbox.

No spam. Unsubscribe anytime. We respect your privacy.

Feedback for Why JSON.stringify() Returns Undefined Guide

Help us improve! Share your thoughts, report bugs, or suggest new features.

Get in Touch

We'd love to hear from you! Write us for any additional feature request, issues, query or appreciation.

Your feedback helps us improve and build better tools for the developer community.