How to find empty fields in a JSON file?

There are several ways to find empty fields in a JSON file, depending on your preferences and the tools available. Here are the most common approaches:

Using jq (Command Line)

jq is a powerful JSON processor that's perfect for this task:

# Find empty strings
jq -r 'paths as $p | select(getpath($p) == "") | $p | join(".")' file.json

# Find null values
jq -r 'paths as $p | select(getpath($p) == null) | $p | join(".")' file.json

# Find both empty strings and null values
jq -r 'paths as $p | select(getpath($p) == "" or getpath($p) == null) | $p | join(".")' file.json

# Show the field path and its value
jq -r 'paths as $p | select(getpath($p) == "" or getpath($p) == null) | "\($p | join(".")): \(getpath($p))"' file.json

Using Python

import json

def find_empty_fields(obj, path=""):
    empty_fields = []
    
    if isinstance(obj, dict):
        for key, value in obj.items():
            current_path = f"{path}.{key}" if path else key
            
            if value == "" or value is None:
                empty_fields.append(current_path)
            elif isinstance(value, (dict, list)):
                empty_fields.extend(find_empty_fields(value, current_path))
    
    elif isinstance(obj, list):
        for i, item in enumerate(obj):
            current_path = f"{path}[{i}]"
            if item == "" or item is None:
                empty_fields.append(current_path)
            elif isinstance(item, (dict, list)):
                empty_fields.extend(find_empty_fields(item, current_path))
    
    return empty_fields

# Usage
with open('file.json', 'r') as f:
    data = json.load(f)

empty_fields = find_empty_fields(data)
for field in empty_fields:
    print(field)

Using Node.js/JavaScript

const fs = require('fs');

function findEmptyFields(obj, path = '') {
    const emptyFields = [];
    
    if (typeof obj === 'object' && obj !== null) {
        if (Array.isArray(obj)) {
            obj.forEach((item, index) => {
                const currentPath = `${path}[${index}]`;
                if (item === '' || item === null || item === undefined) {
                    emptyFields.push(currentPath);
                } else if (typeof item === 'object') {
                    emptyFields.push(...findEmptyFields(item, currentPath));
                }
            });
        } else {
            Object.entries(obj).forEach(([key, value]) => {
                const currentPath = path ? `${path}.${key}` : key;
                if (value === '' || value === null || value === undefined) {
                    emptyFields.push(currentPath);
                } else if (typeof value === 'object') {
                    emptyFields.push(...findEmptyFields(value, currentPath));
                }
            });
        }
    }
    
    return emptyFields;
}

// Usage
const data = JSON.parse(fs.readFileSync('file.json', 'utf8'));
const emptyFields = findEmptyFields(data);
emptyFields.forEach(field => console.log(field));

Using grep (for simple cases)

If you just want to find lines with empty string values:

grep '""' file.json
grep 'null' file.json

Example

Given this JSON file:

{
  "name": "John",
  "email": "",
  "age": 30,
  "address": {
    "street": "123 Main St",
    "city": "",
    "country": null
  },
  "hobbies": ["reading", "", "swimming"]
}

The tools above would identify:

  • email (empty string)
  • address.city (empty string)
  • address.country (null)
  • hobbies[1] (empty string in array)