2017-06-02 130 views
1

我試圖忽略零值接口omitempty沒有遺漏接口零值JSON

package main 

import (
    "fmt" 
    "encoding/json" 
) 

type MyStruct struct{ 
Val interface{} `json:"val,omitempty"` 
} 

func main() { 
    var s []string 
    s = nil 
    m := MyStruct{ 
    Val : s, 
    } 

    b, _:= json.Marshal(m) 
    fmt.Println(string(b)) 
} 

這裏是操場鏈接https://play.golang.org/p/cAE1IrSPgm 此輸出

{"val":null} 

爲什麼不治療它作爲一個空值?有沒有辦法從json中省略這些nil值。

+0

'm.Val'在這個例子不是零。 –

+1

指向'nil' *的*變量與指向具有'nil'值*的變量的*變量不一樣。正如Cerise Limon指出的那樣,後者不是'nil',即'm.Val'指向一個變量's'。如果將'm'定義爲'm:= MyStruct {Val:nil}',它將被省略。 – putu

+0

@putu我明白。但在我的情況下,變量s的值來自數據庫查詢,並且需要將其分配給Val。所以這不可能是一個直接的任務。 – Anuruddha

回答

2

documentation

STRUCT值編碼爲JSON對象。每個出口結構領域成爲對象的成員,除非

  • 領域的標籤爲「 - 」,或
  • 該字段爲空,它的標籤指定「omitempty」選項。

空值爲假,0,任何零指針或接口值,以及任何數組,切片,映射或長度爲零的字符串。

它不省略說明原因here

接口值是nil只有如果內值和類型都 未設置,(零,無)。特別是,一個零接口將始終保持一個無類型的 。如果我們在接口 值內存儲一個類型爲* int的零指針,則無論 指針的值(* int,nil)如何,內部類型都將是* int。即使內部指針爲零,這樣的接口值也將是非零的,即 。

eg

var s []string 
s = nil 
var temp interface{} 
fmt.Println(temp==nil) // true 
temp = s 
fmt.Println(temp==nil) // false 

對於你的情況,你可以做

https://play.golang.org/p/ZZ_Vzwq4QF

https://play.golang.org/p/S5lMgqVXuB

+0

這不完全是我說話的情況。你直接將nil分配給Val – Anuruddha

+0

啊我現在看到你的問題,讓我改變答案。 –