2012-02-26 34 views
54

我需要一个JSON字符串,如浮点数解码:如何解码JSON的类型从字符串转换为Golang中的float64?

{"name":"Galaxy Nexus", "price":"3460.00"} 

我用下面的Golang代码:

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type Product struct { 
    Name string 
    Price float64 
} 

func main() { 
    s := `{"name":"Galaxy Nexus", "price":"3460.00"}` 
    var pro Product 
    err := json.Unmarshal([]byte(s), &pro) 
    if err == nil { 
     fmt.Printf("%+v\n", pro) 
    } else { 
     fmt.Println(err) 
     fmt.Printf("%+v\n", pro) 
    } 
} 

当我运行它,得到的结果是:

json: cannot unmarshal string into Go value of type float64 
{Name:Galaxy Nexus Price:0} 

我想知道如何解码类型转换的JSON字符串。

回答

112

答案是相当少的复杂。只需添加告诉JSON interpeter这是一个字符串编码float64与,string(请注意,我只是改变了Price定义):

package main 

import (
    "encoding/json" 
    "fmt" 
) 

type Product struct { 
    Name string 
    Price float64 `json:",string"` 
} 

func main() { 
    s := `{"name":"Galaxy Nexus", "price":"3460.00"}` 
    var pro Product 
    err := json.Unmarshal([]byte(s), &pro) 
    if err == nil { 
     fmt.Printf("%+v\n", pro) 
    } else { 
     fmt.Println(err) 
     fmt.Printf("%+v\n", pro) 
    } 
} 
+0

谢谢!我认为这是解决我的问题的最佳解决方案。你能告诉我关于“,字符串”用法的官方文件在哪里? – yanunon 2012-03-06 02:35:05

+5

我在[link](http://weekly.golang.org/pkg/encoding/json/)上找到了它。 – yanunon 2012-03-06 02:47:29

+0

+1太棒了。我不知道这件事。 – Mostafa 2012-03-06 10:20:02

5

在引号中传递值使其看起来像字符串。将"price":"3460.00"更改为"price":3460.00,一切正常。

如果您不能删除引号,你必须自己,解析它使用strconv.ParseFloat

package main 

import (
    "encoding/json" 
    "fmt" 
    "strconv" 
) 

type Product struct { 
    Name  string 
    Price  string 
    PriceFloat float64 
} 

func main() { 
    s := `{"name":"Galaxy Nexus", "price":"3460.00"}` 
    var pro Product 
    err := json.Unmarshal([]byte(s), &pro) 
    if err == nil { 
     pro.PriceFloat, err = strconv.ParseFloat(pro.Price, 64) 
     if err != nil { fmt.Println(err) } 
     fmt.Printf("%+v\n", pro) 
    } else { 
     fmt.Println(err) 
     fmt.Printf("%+v\n", pro) 
    } 
} 
+0

有没有办法不改变'产品'结构和实现解码函数或接口来解析字符串浮动? – yanunon 2012-02-26 13:26:05

+1

@yanunon是的,你可以为'Unmarshal'使用'map [string] interface {}'类型的映射,并将其解析到你的结构中。 – Mostafa 2012-02-26 14:11:11

+0

@yanunon或者如果你想要**真正的**灵活性,你可以编写自己的'Unmarshal',它使用'map [string] interface {}'调用默认的'Unmarshal',但使用'reflect'和'strconv'包来解析。 – Mostafa 2012-02-26 14:18:20

4

只是让你知道你可以做到这一点没有Unmarshal和使用json.decode。这里是Go Playground

package main 

import (
    "encoding/json" 
    "fmt" 
    "strings" 
) 

type Product struct { 
    Name string `json:"name"` 
    Price float64 `json:"price,string"` 
} 

func main() { 
    s := `{"name":"Galaxy Nexus","price":"3460.00"}` 
    var pro Product 
    err := json.NewDecoder(strings.NewReader(s)).Decode(&pro) 
    if err != nil { 
     fmt.Println(err) 
     return 
    } 
    fmt.Println(pro) 
} 
相关问题