Data Wrangling at Scale: Converting JSON to CSV, GraphQL Schemas, and Type Definitions
A practical engineering guide on parsing complex nested JSON trees, recursive object flattening algorithms, automated GraphQL schema inference, and browser-native data transformation.
JSON (JavaScript Object Notation) is the ubiquitous protocol for Web APIs and NoSQL document stores. However, data analysts, database administrators, and GraphQL developers frequently need to convert deeply nested JSON payloads into flat relational tables (CSV), GraphQL schemas, or static TypeScript interface definitions. Building fast client-side converters requires understanding recursive AST traversals and object flattening logic.
1. The Challenge of Nested JSON Structures
Unlike flat tabular formats like SQL tables or CSV spreadsheets, JSON objects support arbitrary nesting, dynamic key-value pairs, arrays of mixed types, and null values:
{
"user": {
"id": 101,
"profile": {
"firstName": "Jane",
"address": { "city": "San Francisco", "state": "CA" }
},
"roles": ["admin", "developer"]
}
} 2. Flattening Nested JSON Objects to Tabular CSV
To convert hierarchical JSON trees into two-dimensional CSV rows and columns, a recursive flattening algorithm traverses nested objects and constructs delimiter-joined column names (e.g. profile.address.city):
function flattenObject(obj, prefix = '', result = {}) {
for (const key in obj) {
if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;
const propName = prefix ? `${prefix}.${key}` : key;
const value = obj[key];
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
flattenObject(value, propName, result);
} else if (Array.isArray(value)) {
result[propName] = value.join('; ');
} else {
result[propName] = value;
}
}
return result;
} 3. Inferring GraphQL Types & Schemas from JSON
When migrating REST API endpoints to GraphQL, backend developers must construct GraphQL Object Types from sample HTTP response payloads. Type inference engines map scalar JSON values to GraphQL primitives:
- JavaScript
number(integer) → GraphQLInt - JavaScript
number(float) → GraphQLFloat - JavaScript
boolean→ GraphQLBoolean - JavaScript
string→ GraphQLString - JavaScript
object→ Nested GraphQLtype Name { ... }
type UserProfileAddress {
city: String
state: String
}
type UserProfile {
firstName: String
address: UserProfileAddress
}
type User {
id: Int
profile: UserProfile
roles: [String]
} 4. Automatic TypeScript Interface Generation
Frontend teams consuming external API payloads often paste JSON responses into converter tools to generate strong TypeScript typings. Automatic type generation guarantees type safety during runtime data fetching:
export interface UserAddress {
city: string;
state: string;
}
export interface UserProfile {
firstName: string;
address: UserAddress;
}
export interface UserResponse {
id: number;
profile: UserProfile;
roles: string[];
} 5. Streaming & Zero-Server Data Security
Transforming large dataset dumps (10MB+ JSON files) inside online converters presents significant privacy risks if data is uploaded to remote cloud conversion servers.
By utilizing HTML5 Web Workers and JavaScript Blob streams inside the user's browser, data conversion occurs entirely locally inside browser RAM, ensuring sensitive customer records never leak onto external networks.