普通网友 2018-08-22 07:00 采纳率: 0%
浏览 181
已采纳

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

Given a go struct

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

when marshalled with something like this

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

the result is

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

The result desired is

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

I've tried explicitly stating that Abn is a string.

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

which did not change the result.

How do you marshal a sql.NullString such that the output is flattened to give just the value in go?

EDIT

Something like I ended up with after reading the answers from https://stackoverflow.com/users/8256506/nilsocket and https://stackoverflow.com/users/965900/mkopriva

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"`         
}
  • 写回答

2条回答 默认 最新

  • dongnan4571 2018-08-22 07:35
    关注

    Here is the code,

    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))
    }
    

    Here is the blog post which explains it in detail.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建