我已经从给定的数据库中提取了一些数据-但是格式不符合我的要求。
示例结构:
type myStruct struct {
ID int `json:"Id"`
Language string `json:"Language"`
Location string `json:"Location"`
}
好吧,我使用表示给定返回列的自定义结构序列化了给定的字符串映射:
func transformJSON(extract []map[string]*sql.SqlCell) ([]byte, error) {
return json.MarshalIndent(extract, "", " ")
}
这将返回有效的JSON,但格式为:
{
{
"id": {
"Value": {
"Long": 12353
}
},
"language": {
"Value": {
"String_": "ja-JP"
}
},
"location": {
"Value": {
"String_": "Osaka"
}
},
请参阅上面的结构,我想要这样的格式:
[
{
"Id": 12353,
"Language": "ja-JP",
"Location": "Osaka"
},
// .. other objects
]
假设对func transformJSON
的输入相同,我如何将嵌套键与列类型值进行匹配?
我应该先Marshal
地图,然后转换数据-还是在编组前直接使用[]map[string]*sql.SqlCell
数据结构?
在我的脑海中,我一直在思考:
func transformJSON(extract []map[string]*sql.SqlCell) ([]byte, error) {
struct :=[] myStruct{}
// Loop over extract objects, match nested keys, write to struct?
return json.MarshalIndent(struct, "", " ")
}
答案 0 :(得分:1)
创建一个自定义解组器,将全部内容解组,然后为您进行转换:
type MyStruct struct {
ID int `json:"Id"`
Language string `json:"Language"`
Location string `json:"Location"`
}
type val struct {
Value struct {
String string `json:"String_"`
Long int `json:"Long"`
}
}
func (s *MyStruct) UnmarshalJSON(p []byte) error {
var result struct{
ID val `json:"Id"`
Language val `json:"language"`
Location val `json:"location"`
}
if err := json.Unmarshal(p, &result); err != nil {
return err
}
s.ID = result.ID.Value.Long
s.Language = result.Langauge.Value.String
s.Location= result.Location.Value.String
return nil
}
请注意,在此示例中完成了最少的错误检查和数据验证-我将其留给读者练习。