我正在尝试添加字符串"雇员";到我现有的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 here
x.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()))
如果这不是你想要的,请在你的问题中添加更多的细节(理想情况下,你的尝试是一个最小的、可复制的例子(