将根元素添加到Go lang中现有的Json中

  • 本文关键字:Json lang Go 元素 添加 go
  • 更新时间 :
  • 英文 :


我正在尝试添加字符串"雇员";到我现有的JSON响应。此外,我们需要能够根据用户条件生成此版本的json。只有在满足用户条件的情况下,我才需要生成第二个版本的json,字符串为"雇员";添加。如果不是没有字符串的第一版本;"雇员";应该生成。我如何在不更新现有struct的情况下实现它?我如何使用if子句来检查条件,然后基于它生成json?

下面是我在go 中现有的json响应

[
{
"EmpId":{
"String":"ABCD",
"Valid":true
},
"Department":{
"Float64":0,
"Valid":true
}
}
]

如何在不基于输入参数更改现有结构的情况下获得如下json响应?

{
"Employee":[
{
"EmpId":{
"String":"ABCD",
"Valid":true
},
"Department":{
"Float64":0,
"Valid":true
}
}
]
}

以下是我的代码:步骤1:模型文件夹

type EmployeeWithRoot struct {
Employee []Employee
}
type Employee struct {
EmpNbr     sql.NullString  `json:"EmpNbr"`
DateofJoin      sql.NullString   `json:"DateofJoin"`
DeptId  sql.NullString  `json:"DeptId"`
DeptName sql.NullString  `json:"DeptName"`
}

步骤2:代码文件夹

func GetEmpDetails(logRequestId string, logNestedLevel int, EmpNbr string, DateofJoin string) ([]model.EmployeeWithRoot, error) {
logFunctionFunctionName := "code.GetEmpDetails"
logStartTime := time.Now()
logNestedLevel++
defer configurations.TimeTrack(logFunctionFunctionName, logRequestId, logStartTime, logNestedLevel)
rows, err := db.Query(utils.SELECT_OF_EMP_AGGR, EmpNbr, DateofJoin, DeptId, DeptName)
if err != nil {
return nil, err
}
defer rows.Close()
var e []model.EmployeeWithRoot
for rows.Next() {
var x model.EmployeeWithRoot
err := rows.Scan(&x.Employee.EmpNbr, &x.Employee.DateofJoin, &x.Employee.DeptId,&x.Employee.DeptName)
if err != nil {
return nil, err
}
e = append(e, x)
}
err = rows.Err()
if err != nil {
return nil, err
}
return e, nil
}

第3步:API文件夹

Employee, err := code.GetEmpDetails(logRequestId, logNestedLevel, EmpNbr, DateofJoin)
if err != nil {
log.Panic(err)
}
marshalDataForRequestContentType(logRequestId, logNestedLevel, w, r, Employee)

我得到以下错误。

x。受雇者EmpNbr未定义(类型[]model.Eemployee没有字段或方法EmpNbr(x.Employee.DateofJoin未定义(类型[]model.Emplloyee没有字段或方法DateofJoin(enter code herex.Employee.DeptId未定义(类型[]model.Eemployee没有字段或方法DeptId(x.Employee.DeptName未定义(类型[]model.Eemployee没有字段或方法DeptName(

考虑到您只是将其包装为一个外部对象,我看不出有任何理由需要更改现有结构,只需将其包装在一个新结构中即可。我必须在这里进行一些猜测/假设,因为您只显示了JSON,而没有显示生成它的Go代码,但假设您现有的JSON是通过封送var response []Employee之类的东西生成的,则可以在您的条件下通过封送生成所需的JSON:

json.Marshal(struct{Employee []Employee}{response})

工作示例:https://go.dev/play/p/vwDvxnQ96G_2

使用字符串串联:

func addRoot(json string) string {
return `{ "Employee":` + json + `}`
}

在GoLang操场上举一个例子。

如果你使用[]字节而不是字符串,下面是代码:

func addRoot(json []byte) []byte {
const prefix = `{ "Employee":`
const suffix = `}`
result := make([]byte, 0, len(prefix)+len(json)+len(suffix))
return append(append(append(result, prefix...), json...), suffix...)
}

在GoLang操场上运行此示例。

如果字节片([]byte(中有一些JSON,则可以直接添加外部元素,例如(操场(:

existingJSON := []byte(`[
{
"EmpId":{
"String":"ABCD",
"Valid":true
},
"Department":{
"Float64":0,
"Valid":true
}
}
]`)
b := bytes.NewBufferString(`{"Employee":`)
b.Write(existingJSON)
b.WriteString(`}`)
fmt.Println(string(b.Bytes()))

如果这不是你想要的,请在你的问题中添加更多的细节(理想情况下,你的尝试是一个最小的、可复制的例子(

相关内容

最新更新