【问题标题】:Golang remove string prefix when unmarshalling JSONGolang在解组JSON时删除字符串前缀
【发布时间】:2017-09-06 18:20:17
【问题描述】:

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

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

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

{
  "id": "1234567890"
}

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

【问题讨论】:

  • 您可以通过使structid 字段具有自定义类型并让该类型实现json.Unmarshaler 接口来做到这一点。只需确保 id 字段已实际导出,否则将无法解码。
  • 后处理。如果您不提供自己的解组器(太多),则在解组期间基本上可以撤消。
  • 如果您正在考虑自定义解组,您一定已经知道这是可能的,所以...您的问题到底是什么?
  • 我在实际实现自定义解组时遇到了一些问题。我试图在整个结构本身上做到这一点。但正如@mkopriva 提到的,它应该在 id 字段本身上完成。

标签: go unmarshalling


【解决方案1】:

您可以在需要修剪的数据上提供自定义 UnmarshalJSON 方法,这是一个示例实现,如果您必须正则表达式匹配开始而不是匹配硬字符串(或本例中的字节数组),您可能需要扩展:

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
}

【讨论】:

    猜你喜欢
    • 2011-05-08
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2016-12-30
    • 2013-02-26
    • 2019-05-30
    • 2017-03-22
    • 1970-01-01
    相关资源
    最近更新 更多