解组JSON时Golang删除字符串前缀

时间:2017-09-06 18:20:18

标签: go unmarshalling

在我的json数据结构中,我有一个可以有前缀的字符串。解组JSON时,是否可以使用函数删除该前缀?我正在研究golang中的自定义JSON解组并尝试利用它。

例如。有效载荷可以是以下任何一种

{
  "id": "urn:uuid:1234567890"
}

{
  "id": "1234567890"
}

当我执行JSON.unmarshall(data, &struct)时,我希望unmarshall函数处理从字符串中删除urn:uuid前缀(如果存在),那么结构将始终具有值1234567890 for { {1}}。

1 个答案:

答案 0 :(得分:2)

您可以为需要修剪的数据提供自定义UnmarshalJSON方法,这是一个示例实现,如果必须匹配start,而不是匹配硬字符串(或者在这种情况下为字节数组),则可能需要扩展:

go playground

package main

import (
    "bytes"
    "encoding/json"
    "log"
)

var (
    sampleJSON   = []byte(`{"id": "urn:uuid:1234567890"}`)
    prefixToTrim = []byte(`urn:uuid:`)
)

type IDField string

type Data struct {
    ID IDField `json:"id"`
}

func main() {
    d := &Data{}
    err := json.Unmarshal(sampleJSON, d)
    if err != nil {
        log.Fatal(err)
    }

    log.Println(d.ID)
}

// UnmarshalJSON provides custom unmarshalling to trim `urn:uuid:` prefix from IDField
func (id *IDField) UnmarshalJSON(rawIDBytes []byte) error {

    // trim quotes and prefix
    trimmedID := bytes.TrimPrefix(bytes.Trim(rawIDBytes, `"`), prefixToTrim)

    // convert back to id field & assign
    *id = IDField(trimmedID)
    return nil
}