我有下面的Go结构,我想将一些Json数据解压缩到其中。它的工作原理非常完美,除了Values映射,它的类型是map[string]string。
type Data struct {
Id int `jons:"id"`
Values map[string]string `json:"values"`我的Json数据(我无法更改其格式)具有以下结构和示例数据:
{
id: 1,
values: {
key1: "a string value",
key2: 7
}
}解编组json数据失败,因为Go无法将值7解封为字符串。
json: cannot unmarshal number into Go struct field Data.Values of type string是否有一种方法可以隐式地将Json值转换为字符串,而不考虑所感知的类型?将Json数据更改为将值格式化为字符串,( key2: "7" )不是一个选项。
发布于 2021-11-15 09:19:57
由于json中可以有一个整数或字符串,所以最好使用一个接口。
就像这样:
type Data struct {
Id int `jons:"id"`
Values map[string]interface{} `json:"values"`
}这应该能起作用。
发布于 2021-11-15 09:35:42
您可以创建自己的字符串类型并对其实现UnmarshalJSON函数。
type MadSrting string
type Data struct {
Id int `jons:"id"`
Values map[string]MadString `json:"values"`
}
func (mad *MadString) UnmarshalJSON(data []byte) error {
if n := len(data); n > 1 && data[0] == '"' && data[n-1] == '"' {
return json.Unmarshal(data, (*string)(mad))
}
*mad = MadString(data)
return nil
}发布于 2021-11-15 10:27:17
为了收集所提供的答案,基本上有三种方法:
string并实现encoding/json.Unmarshaler接口,以创造性地解析JSON文档中的值。map[string]interface{}类型的映射,然后在每次访问该值时使用类型切换,或者从生成的映射中填充其他数据类型(假设是map[string]string )(在任何情况下都将使用类型切换)。encoding/json.Decoder --并决定如何在解码阶段解码特定的值,并生成一个string,不管所解析的值是什么类型。https://stackoverflow.com/questions/69971668
复制相似问题