猿问

如何通过结构重新格式化 JSON?

我已经从给定的数据库中提取了一些数据——但是格式不符合我的要求。


示例结构:


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, "", " ")

}


慕无忌1623718
浏览 88回答 1
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}请注意,在此示例中完成了最少的错误检查和数据验证
随时随地看视频慕课网APP

相关分类

Go
我要回答