JSON to Code Generator, Go, Python, Java, Kotlin, C# & Rust
Paste a JSON sample and get typed data structures in the language you need, Go structs, Python dataclasses or Pydantic v2 models, Java records, Kotlin data classes, C# classes, or Rust structs. Nested objects, merged arrays, and optional or null fields are handled for you. Runs entirely in your browser; nothing is uploaded.
How it works
This is a deterministic source-to-source transformation, not a guess. The JSON is parsed once with JSON.parse following RFC 8259, which defines the six JSON value types, object, array, string, number, boolean, and null. A single recursive pass infers a language-neutral shape for every node, then a per-language emitter prints code using each language's own specification for types and serialization.
- Primitives. A JSON string maps to
string/str/String, and a boolean to the language's bool type. Because JSON has only one number type, the tool checks the literal: a whole number becomes an integer type (int64,i64,long), a decimal becomes a floating type (float64,f64,double). The 64-bit toggle switches integers between 64- and 32-bit width. - Objects become named types. Each object is emitted as a struct, record, data class, or class. The name is the PascalCased key, a
profileobject becomesProfile, and anordersarray of objects yields a singularisedOrderelement type. Structurally identical objects reuse one type; genuine name clashes get a numeric suffix. - Arrays are merged.Every element is inferred and the schemas are unioned: object fields are merged, and a key present in only some elements is marked optional. A key seen as an integer in one element and a decimal in another widens to the floating type. An empty array has nothing to infer, so its element falls back to the language's
any/Valuetype. - Optional and nullable. A missing key is optional; a null value is nullable. Both render as the idiomatic optional form, a pointer with
omitemptyin Go,Optional[T] = Nonein Python,Option<T>in Rust, a boxed nullable in Java, andT?in Kotlin and C#. - Naming and safety.Field names are cased to each language's convention (exported PascalCase for Go, snake_case for Python and Rust, camelCase for Java and Kotlin), while the original wire name is preserved in a
jsontag,@JsonProperty,serde rename,@SerialName, or[JsonPropertyName]. Keys that start with a digit or contain hyphens are sanitised (first-name→first_name), and reserved words are escaped.
Because the rules are fixed, identical input and identical options always produce byte-identical output. As a cross-check, the generator runs a structural assignability test, it confirms your original JSON value satisfies the types it just produced, and shows the result as the Accepts input badge. Every mapping is traceable to the language and serializer specifications cited below.
Worked examples
Frequently asked questions
Sources & references
- RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format
- The Go Programming Language Specification: Struct types (and encoding/json tags)
- Pydantic v2: Models and Field aliases
- PEP 557: Data Classes (field defaults and ordering)
- Serde: Field attributes (#[serde(rename = "...")])
- Microsoft Docs: System.Text.Json and [JsonPropertyName]
- Kotlin: Data classes (with kotlinx.serialization @SerialName)
The type-mapping rules on this page were last cross-checked against the language and serializer specifications above on 2026-07-16. The generator is deterministic, so its output can be reproduced exactly from the same input and options.
Related tools
Comments & feedback
Spotted a bug or want an improvement? Tell us, our team reviews every comment, and good ideas get built. Comments are public and anonymous.
Found a JSON shape that generates wrong code, or want another language target?
Email me at [email protected] , most fixes ship within 24 hours.