title: Parsing JSONSchema to struct type in golang
body: <p>So, my use case consists of parsing varying JSON schemas into new struct types, which will be further used with an ORM to fetch data from a SQL database. Being compiled in nature, I believe there will not be an out-of-the-box solution in go, but is there any hack available to do this, without creating a separate go process. I tried with reflection, but could not find a satisfactory approach.</p>
  
  <p>Currently, I am using <a href="https://github.com/a-h/generate" rel="nofollow noreferrer">a-h generate</a> library which does generate the structs, but I am stuck at how to load these new struct types in go runtime.</p>
  
  <p><strong>EDIT</strong></p>
  
  <p>Example JSON Schema:</p>
  
  <pre><code>{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "title": "Address",
    "id": "Address",
    "type": "object",
    "description": "address",
    "properties": {
      "houseName": {
        "type": "string",
        "description": "House Name",
        "maxLength": 30
      },
      "houseNumber": {
        "type": "string",
        "description": "House Number",
        "maxLength": 4
      },
      "flatNumber": {
        "type": "string",
        "description": "Flat",
        "maxLength": 15
      },
      "street": {
        "type": "string",
        "description": "Address 1",
        "maxLength": 40
      },
      "district": {
        "type": "string",
        "description": "Address 2",
        "maxLength": 30
      },
      "town": {
        "type": "string",
        "description": "City",
        "maxLength": 20
      },
      "county": {
        "type": "string",
        "description": "County",
        "maxLength": 20
      },
      "postcode": {
        "type": "string",
        "description": "Postcode",
        "maxLength": 8
      }
    }
  }
  </code></pre>
  
  <p>Now, in the above-mentioned library, there is a command line tool, which generates the text for struct type for above json as below:</p>
  
  <pre><code>// Code generated by schema-generate. DO NOT EDIT.
  
  package main
  
  // Address address
  type Address struct {
    County string `json:"county,omitempty"`
    District string `json:"district,omitempty"`
    FlatNumber string `json:"flatNumber,omitempty"`
    HouseName string `json:"houseName,omitempty"`
    HouseNumber string `json:"houseNumber,omitempty"`
    Postcode string `json:"postcode,omitempty"`
    Street string `json:"street,omitempty"`
    Town string `json:"town,omitempty"`
  }
  </code></pre>
  
  <p>Now, the issue is that how to use this struct type without re-compilation in the program. There is a hack, where I can start a new go process, but that doesn't seem a good way to do it. One other way is to write my own parser for unmarshalling JSON schema, something like:</p>
  
  <pre><code>b := []byte(`{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"]}`)
  var f interface{}
  json.Unmarshal(b, &amp;f)
  m := f.(map[string]interface{})
  for k, v := range m {
      switch vv := v.(type) {
      case string:
          fmt.Println(k, "is string", vv)
      case float64:
          fmt.Println(k, "is float64", vv)
      case int:
          fmt.Println(k, "is int", vv)
      case []interface{}:
          fmt.Println(k, "is an array:")
          for i, u := range vv {
              fmt.Println(i, u)
          }
      default:
          fmt.Println(k, "is of a type I don't know how to handle")
      }
  }
  </code></pre>
  
  <p>Can someone please suggest some pointers to look for. Thanks.</p>