当前位置: 首页 > 面试题库 >

如何编组sql.NullString以便将输出展平以仅给出go中的值?

舒博雅
2023-03-14
问题内容

给定一个结构

type Company struct {
    ID   int             `json:"id"`              
    Abn  sql.NullString  `json:"abn,string"`
}

当像这样编组

company := &Company{}
company.ID = 68
company.Abn = "SomeABN"
result, err := json.Marshal(company)

结果是

{
    "id": "68",
    "abn": {
        "String": "SomeABN",
        "Valid": true
    }
}

所需的结果是

{
    "id": "68",
    "abn": "SomeABN"
}

我已经尝试过明确指出Abn是一个字符串。

Abn  sql.NullString  `json:"abn,string"`

并没有改变结果。

如何编组sql.NullString以便将输出展平以仅给出go中的值?

编辑

在阅读了答案后,我最终得到了类似的结果

package main

import (
    "database/sql"
    "encoding/json"
    "reflect"
    //"github.com/lib/pq"
)

/*
    https://medium.com/aubergine-solutions/how-i-handled-null-possible-values-from-database-rows-in-golang-521fb0ee267
*/

type NullString sql.NullString

func (x *NullString) MarshalJSON() ([]byte, error) {
    if !x.Valid {
        x.Valid = true
        x.String = ""
        //return []byte("null"), nil
    }
    return json.Marshal(x.String)
}

// Scan implements the Scanner interface for NullString
func (ns *NullString) Scan(value interface{}) error {
    var s sql.NullString
    if err := s.Scan(value); err != nil {
        return err
    }

    // if nil then make Valid false
    if reflect.TypeOf(value) == nil {
        *ns = NullString{s.String, false}
    } else {
        *ns = NullString{s.String, true}
    }

    return nil
}

type Company struct {
    ID                     int             `json:"id"`    
    Abn                    NullString      `json:"abn"`         
}

问题答案:

这是代码,

package main

import (
    "database/sql"
    "encoding/json"
    "fmt"
    "log"
)

//Company details
type Company struct {
    ID  int        `json:"id"`
    Abn NullString `json:"abn"`
}

//NullString is a wrapper around sql.NullString
type NullString sql.NullString

//MarshalJSON method is called by json.Marshal,
//whenever it is of type NullString
func (x *NullString) MarshalJSON() ([]byte, error) {
    if !x.Valid {
        return []byte("null"), nil
    }
    return json.Marshal(x.String)
}

func main() {
    company := &Company{}
    company.ID = 68
    //create new NullString value
    nStr := sql.NullString{String: "hello", Valid: true}
    //cast it
    company.Abn = NullString(nStr)
    result, err := json.Marshal(company)
    if err != nil {
        log.Println(err)
    }
    fmt.Println(string(result))
}

这是博客文章,详细解释了它。



 类似资料:
  • 问题内容: 我想将当前目录的文件放在一个数组中,并使用此脚本回显每个文件: 输出: 有谁知道为什么在此for循环中仅打印第一个元素? 问题答案: 扩展到数组的第一个元素。试试看,它只会打印数组的第一个元素。由于相同的原因,for循环仅打印一个元素。 要扩展到数组的所有元素,您需要编写为。 迭代Bash数组元素的正确方法:

  • 问题内容: 是否有内置方式或合理的标准软件包,可让您将标准UUID转换为短字符串,从而启用较短的URL? 即利用了较大范围的字符,例如输出较短的字符串。 我知道我们可以使用base64对字节进行编码,如下所示,但是我正在创建一个看起来像“单词”的字符串,即no 和: 问题答案: 甲通用唯一标识符(UUID)是一个128位的值,它是16个字节。对于人类可读的显示,许多系统使用规范格式,该规范格式使用

  • 我目前正在练习Map-reduce(Hadoop2.2),需要您在其中一个概念上的帮助。 我有一个用例,我想用两个工作来完成。我希望job1的输出被写入分布式缓存,并将其作为输入传递到第二个作业。 注意:这两个文件都包含非常大的数据。 找出每首古典歌曲的平均评分。 我提出的实际/预期解决方案是,我将使用两个链接作业。 1.job1:它将获得所有经典歌曲的ID,并添加到分发缓存 非常感谢你的帮助。

  • 我的使用案例是,我有一个应用程序,用户可以在其中按下按钮,然后在外部扬声器和有线耳机/蓝牙设备之间切换。如果用户连接到有线耳机或蓝牙耳机设备,我想将该有线耳机或蓝牙的音频输出切换到外部扬声器,然后当他们再次单击时,重新启动有线耳机/蓝牙音频输出。 有人知道Android 10可以做到这一点吗?我在这篇文章中尝试了以下示例,但它并不总是适用于蓝牙情况。我的代码如下: 我还拥有用户音频的必要权限: <

  • 问题内容: 有没有一种方法可以扩大交互式或脚本执行模式下的输出显示? 具体来说,我在上使用该函数。当DataFrame5列(标签)宽时,我得到了所需的描述性统计信息。但是,如果的DataFrame列更多,则统计信息将被抑制,并返回如下所示的内容: 无论是6列还是7列,都将给出“ 8”值。“ 8”是什么意思? 我已经尝试过将IDLE窗口拖动更大,并增加“ Configure IDLE”宽度选项,但无

  • 我需要以.csv格式输出我的hadoop结果。我要怎么做?我的代码:https://github.com/studhadoop/xml/blob/master/xmlparser11.java 我是否应该简单地在代码中包含csvoutputFormat。我正在使用mapreduce API MyJob.sh 解决方案