Итак, мой вариант использования состоит в разборе изменяющихся схем JSON на новые типы структур, которые в дальнейшем будут использоваться с ORM для извлечения данных из базы данных SQL.Будучи скомпилированным по своей природе, я считаю, что не будет готового решения на ходу, но есть ли какой-нибудь хак для этого без создания отдельного процесса go.Я пытался с отражением, но не смог найти удовлетворительный подход.
В настоящее время я использую библиотеку ah generate , которая генерирует структуры, но я застрял в том, как загрузить эти новые структурывводит во время выполнения go.
EDIT
Пример схемы JSON:
{
"$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
}
}
}
Теперь в вышеупомянутой библиотеке есть командаИнструмент line, который генерирует текст для типа структуры для вышеупомянутого json, как показано ниже:
// 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"`
}
Теперь проблема заключается в том, как использовать этот тип структуры без повторной компиляции в программе.Есть хак, где я могу начать новый процесс go, но это не кажется хорошим способом сделать это.Еще один способ - написать собственный синтаксический анализатор для демаршаллинговой схемы JSON, что-то вроде:
b := []byte(`{"Name":"Wednesday","Age":6,"Parents":["Gomez","Morticia"]}`)
var f interface{}
json.Unmarshal(b, &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")
}
}
Может кто-нибудь предложить какие-нибудь указатели для поиска.Благодаря.