glideapps / glideapps/quicktype

[BUG]: recursive JSON schema objects generate strange duplicate types

Open
#2,836 1 comment 0 reactions 0 assignees View on GitHub
bug
Dominant language
TypeScript
Stars
13.9k
Forks
1.2k
Avg merge
8h 53m
Merged PRs (30d)
369

Description

## Issue Type

Quicktype's output when given a JSON schema for a recursive object (for example, a tree node) includes additional output where the type that's recursive is duplicated, which can result in huge redundant outputs.

## Context (Environment, Version, Language)

Input Format: JSON schema
Output Language: C# and TypeScript tested, but seems to be present in all of them

app.quicktype.io

## Description

I have a type that represents a tree node which I have a JSON schema for using `$ref`. However when Quicktype generated C# code, it ended up generating significant amounts of redundant code - because the tree node contains many complex types in the "data" field, all of these types ended up being duplicated with prefixes such as "Fluffy" or "Purple".

## Input Data

This is a minimal example of a tree node with just an ID:

```
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "T2",
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string"
}
}
},
"children": {
"type": "array",
"items": {
"$ref": "T2"
}
}
}
}
```

## Expected Behaviour / Output

### C#

```cs
public partial class Tree
{
public Tree[] Children { get; set; }
public TreeData Data { get; set; }
}

public partial class TreeData
{
public string Id { get; set; }
}
```

### TypeScript

```typescript
export interface Tree {
children?: Tree[];
data?: TreeData;
}

export interface TreeData {
id?: string;
}
```

## Current Behaviour / Output

### C#

```cs
public partial class Tree
{
public Tre[] Children { get; set; }
public TreeData Data { get; set; }
}

public partial class Tre
{
public Tre[] Children { get; set; }
public ChildData Data { get; set; }
}

public partial class ChildData
{
public string Id { get; set; }
}

public partial class TreeData
{
public string Id { get; set; }
}
```

### TypeScript

```typescript
export interface Tree {
children?: Tre[];
data?: TreeData;
[property: string]: any;
}

export interface Tre {
children?: Tre[];
data?: ChildData;
[property: string]: any;
}

export interface ChildData {
id?: string;
[property: string]: any;
}

export interface TreeData {
id?: string;
[property: string]: any;
}
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.