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

标签 json go

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

示例结构:

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 的输入相同,我将如何将嵌套键与列类型值匹配?

我应该先编码 映射,然后转换数据——还是在编码之前直接使用[]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, "", " ")
}

最佳答案

创建一个自定义解码器,解码整个事情,然后为您转换:

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
}

请注意,在此示例中完成了最少的错误检查和数据验证——我将其留给读者作为练习。

关于json - 如何通过结构重新格式化 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52258176/

相关文章:

mongodb - 跳过绑定(bind) ID,但将其作为响应返回

python - python 构建 JSON 数据的最快方法

python - 处理 JSON 中的错误转义字符

javascript - 带有字符串键的动态 json 对象

php - 如何在 php 中对数组中的 JSON 对象进行编码?

docker - 如何为微服务应用程序配置 docker 公开端口?

javascript - html - 将 json 附加到链接的正确方法

unit-testing - 我如何测试代码是否真的启动了一个 go 例程?

date - 仅比较日期部分时间。Golang 中的时间

GORM 连接和结果