首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Json解编组:强制成字符串

Json解编组:强制成字符串
EN

Stack Overflow用户
提问于 2021-11-15 08:55:12
回答 4查看 3K关注 0票数 1

我有下面的Go结构,我想将一些Json数据解压缩到其中。它的工作原理非常完美,除了Values映射,它的类型是map[string]string

代码语言:javascript
复制
type Data struct {
    Id          int               `jons:"id"`
    Values      map[string]string `json:"values"`

我的Json数据(我无法更改其格式)具有以下结构和示例数据:

代码语言:javascript
复制
{
   id: 1,
   values: {
      key1: "a string value",
      key2: 7
   }
}

解编组json数据失败,因为Go无法将值7解封为字符串。

代码语言:javascript
复制
json: cannot unmarshal number into Go struct field Data.Values of type string

是否有一种方法可以隐式地将Json值转换为字符串,而不考虑所感知的类型?将Json数据更改为将值格式化为字符串,( key2: "7" )不是一个选项。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-11-15 09:19:57

由于json中可以有一个整数或字符串,所以最好使用一个接口。

就像这样:

代码语言:javascript
复制
type Data struct {
    Id          int                       `jons:"id"`
    Values      map[string]interface{}    `json:"values"`
}

这应该能起作用。

参考代码示例:https://play.golang.org/p/PjxWeLTwsCC

票数 3
EN

Stack Overflow用户

发布于 2021-11-15 09:35:42

您可以创建自己的字符串类型并对其实现UnmarshalJSON函数。

代码语言:javascript
复制
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
}

样本:https://play.golang.org/p/PsJRsvQJPMZ

票数 2
EN

Stack Overflow用户

发布于 2021-11-15 10:27:17

为了收集所提供的答案,基本上有三种方法:

  1. 使用自定义类型值的映射,其类型为“包装”string并实现encoding/json.Unmarshaler接口,以创造性地解析JSON文档中的值。

  1. 将子文档解封为map[string]interface{}类型的映射,然后在每次访问该值时使用类型切换,或者从生成的映射中填充其他数据类型(假设是map[string]string )(在任何情况下都将使用类型切换)。

  1. 使用较低级别的JSON解码工具-- encoding/json.Decoder --并决定如何在解码阶段解码特定的值,并生成一个string,不管所解析的值是什么类型。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69971668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档