首页 > 解决方案 > Golang切片到名称值对的json数组

问题描述

我有以下结构的一部分。

type ParamStruct struct {
    Paramname  string
    Paramvalue interface{}
}

该值可以是一个 int、float 的字符串。我需要将看起来像这样的切片转换为如下所示[{name1 95} {name2 someStrValue} {name3 someOtherStrValue}]的 JSON 数组。

[
{ "name1": 1 },
{ "name2": "someStrValue"},
{ "name3": "someOtherStrValue"}
]

我尝试使用默认函数进行封送处理并获得这样的 JSON 输出..

[{"Paramname":"name1","Paramvalue":95},{"Paramname":"name2","Paramvalue":"someStrValue"},{"Paramname":"name3","Paramvalue":"someOtherStrValue"}]

输出 JSON 必须是名称-值对,如上所示。关于如何获得所需格式的 JSON 输出的任何建议?

这是完整的代码示例

package main

import (
    "encoding/json"
    "fmt"
)

type ParamStruct struct {
    Paramname  string
    Paramvalue interface{}
}

func main() {
    paramlist1 := make([]ParamStruct, 3)

    paramlist1[0].Paramname = "name1"
    paramlist1[0].Paramvalue = 95
    paramlist1[1].Paramname = "name2"
    paramlist1[1].Paramvalue = "someStrValue"
    paramlist1[2].Paramname = "name3"
    paramlist1[2].Paramvalue = "someOtherStrValue"
    fmt.Println(paramlist1)
    js, err := json.Marshal(paramlist1)
    if err != nil {
        fmt.Printf("Error: %s", err.Error())
    } else {
        fmt.Println(string(js))
    }
}

标签: jsongo

解决方案


你可以实现json.Marshaler接口。

例如:

type ParamStruct struct {
    Paramname  string
    Paramvalue interface{}
}

func (ps ParamStruct) MarshalJSON() ([]byte, error) {
    return json.Marshal(map[string]interface{}{ps.Paramname: ps.Paramvalue})
}

https://play.golang.org/p/sUsR-FMZQmq


推荐阅读