json - 使用struct使用key:value作为标记名称创建JSON输出时出现问题

标签 json go marshalling

我想创建一个输出JSON,如下所示,

{
   "Name": "John Smith",
   "City": "London",
   "Contact": [
     { "key": "StreetName", "value": "SomeName" },
     { "key": "PostalCode", "value": "SomeValue" }
   ],
}

我正在尝试使用以下代码实现这一目标,
package main

import (
        "encoding/json"
        "fmt"
        "log"
)

type Person struct {
   Name, City string
   Contact ContactStruct   
}

type ContactStruct struct {
   Street, PostalCode map[string]string
}

func main() {
  StreetData := make(map[string]string)
  StreetData["key"] = "StreetName"
  StreetData["value"] = "ABC Street"

  PostalCodeData := make(map[string]string)
  PostalCodeData["key"] = "PostalCode"
  PostalCodeData["value"] = "12345"

  jsonData := Person{
    Name: "John Smith",
    City: "London",
    Contact: ContactStruct{
       StreetData,
       PostalCodeData,
    },
  }

  finalJsonData, err := json.MarshalIndent(jsonData, " ", "   ")
  if err != nil {
    log.Fatal(err)
  }

  fmt.Println(string(finalJsonData))
}

以下是使用以上代码生成的输出,
 {
    "Name": "John Smith",
    "City": "London",
    "Contact": {
       "Street": {
          "key": "StreetName",
          "value": "ABC Street"
       },
       "PostalCode": {
          "key": "PostalCode",
          "value": "12345"
       }
    }
 }

问题:正如我们所看到的,将使用标记名“Street” PostalCode 创建输出,因为我们正在使用struct值创建JSON。

我尝试探索在map[string]string中使用map[string]interface{}Person struct的各种选项。但这是行不通的。

根据问题开头显示的要求,是否有更好的实现可用于获取JSON输出。

先谢谢您的帮助。我最近开始在golang进行开发。

运行源在这里可用:https://play.golang.org/p/eIxDyWXfZ1C

最佳答案

也许你这样想


type Person struct {
    Name, City string
    Contact    []ContactStruct
}

type ContactStruct struct {
    Key   string
    Value string
}

func main() {

    StreetData := ContactStruct{Key: "StreetName", Value: "ABC Street"}
    PostalCodeData := ContactStruct{Key: "PostalCode", Value: "12345"}
    jsonData := Person{
        Name:    "John Smith",
        City:    "London",
        Contact: []ContactStruct{StreetData, PostalCodeData},
    }
    finalJsonData, err := json.MarshalIndent(jsonData, " ", "   ")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(finalJsonData))
}

关于json - 使用struct使用key:value作为标记名称创建JSON输出时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61078520/

相关文章:

python - 如何从 Django 中的 API 返回数据?

ruby - 如何在 Go 中进行适当的 Git 兼容的 hex sha 打包/压缩

go - Go pub 子库中 PullWait 的行为?

go - 合并多个 go 模块的测试覆盖率

c# - C# 中的 Char * 编码

arrays - 在 Flutter Cards 中插入 JSON 信息?

javascript - jQuery.parseJSON 单引号与双引号

javascript - 在node.js中解析JSON并在jade中显示

c# - 将方法指针作为整数参数从 C# 发送到 C++ 方法

c# - 编码指向结构数组的指针