Skip to content

Json格式化

字段兼容字符串或int

使用json.Number

json.Number.go
package main

import (
    "encoding/json"
    "fmt"
)

type Data struct {
    Value json.Number `json:"value"`
}

func main() {
    // JSON with int
    jsonInt := `{"value": 123}`
    var dataInt Data
    err := json.Unmarshal([]byte(jsonInt), &dataInt)
    if err != nil {
        fmt.Println("Error unmarshaling int:", err)
        return
    }
    intValue, err := dataInt.Value.Int64()
    if err != nil {
        fmt.Println("Error converting json.Number to int64 for int:", err)
        return
    }
    fmt.Printf("Parsed int value: %d (type: %T)\n", intValue, intValue)

    // JSON with string
    jsonString := `{"value": "456"}`
    var dataString Data
    err = json.Unmarshal([]byte(jsonString), &dataString)
    if err != nil {
        fmt.Println("Error unmarshaling string:", err)
        return
    }
    stringValue, err := dataString.Value.Int64() // json.Number handles string conversion
    if err != nil {
        fmt.Println("Error converting json.Number to int64 for string:", err)
        return
    }
    fmt.Printf("Parsed string value: %d (type: %T)\n", stringValue, stringValue)
}

使用UnmarshalJSON自定义类型

Unmarshal.go
package main

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

type FlexibleInt int

func (fi *FlexibleInt) UnmarshalJSON(b []byte) error {
    // Try to unmarshal as an int
    var i int
    if err := json.Unmarshal(b, &i); err == nil {
        *fi = FlexibleInt(i)
        return nil
    }

    // If that fails, try to unmarshal as a string and convert
    var s string
    if err := json.Unmarshal(b, &s); err == nil {
        parsedInt, err := strconv.Atoi(s)
        if err != nil {
            return fmt.Errorf("failed to convert string to int: %w", err)
        }
        *fi = FlexibleInt(parsedInt)
        return nil
    }

    return fmt.Errorf("failed to unmarshal as int or string: %s", string(b))
}

type AnotherData struct {
    Value FlexibleInt `json:"value"`
}

func main() {
    // JSON with int
    jsonInt := `{"value": 789}`
    var dataInt AnotherData
    err := json.Unmarshal([]byte(jsonInt), &dataInt)
    if err != nil {
        fmt.Println("Error unmarshaling int:", err)
        return
    }
    fmt.Printf("Parsed int value: %d (type: %T)\n", dataInt.Value, dataInt.Value)

    // JSON with string
    jsonString := `{"value": "1011"}`
    var dataString AnotherData
    err = json.Unmarshal([]byte(jsonString), &dataString)
    if err != nil {
        fmt.Println("Error unmarshaling string:", err)
        return
    }
    fmt.Printf("Parsed string value: %d (type: %T)\n", dataString.Value, dataString.Value)
}