登录
首页 >  Golang >  Go问答

通过自定义方法解析合并两个字段的 JSON 数据

来源:stackoverflow

时间:2024-02-17 13:36:23 388浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《通过自定义方法解析合并两个字段的 JSON 数据》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~

问题内容

我有一些 json 想要解组到以下结构中

type activity struct {
    start  time.time `json:"start"`
    end    time.time `json:"end"`
}

如果 json 格式正确,则可以正常工作。 然而,有时“结束”字段存在但只是一个空字符串

{
        "start": "2020-06-02T07:48:35.911Z",
        "end":""
}

在这种情况下,我想要 activity.end = activity.start

我是否可以通过实现 unmarshaljson 来做到这一点,还是必须使用地图?


正确答案


基于 mkopriva 的建议:

package main

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

type activity struct {
    start time.time `json:"start"`
    end   time.time `json:"end"`
}

func (a *activity) unmarshaljson(data []byte) error {
    var v struct {
        start time.time
        end   json.rawmessage
    }
    if err := json.unmarshal(data, &v); err != nil {
        return err
    }
    if len(v.end) > 0 && string(v.end) != `""` {
        a.start = v.start
        return json.unmarshal([]byte(v.end), &a.end)
    }
    
    a.start = v.start
    a.end = v.start
    return nil
}

func main() {
    var data1 = []byte(`{"start": "2020-06-02t07:48:35.911z","end":"2021-10-15t07:48:35.911z"}`)
    var data2 = []byte(`{"start": "2020-06-02t07:48:35.911z","end":""}`)

    var a activity
    if err := json.unmarshal(data1, &a); err != nil {
        panic(err)
    }
    fmt.printf("%+v\n", a)

    if err := json.unmarshal(data2, &a); err != nil {
        panic(err)
    }
    fmt.printf("%+v\n", a)
}

输出:

{Start:2020-06-02 07:48:35.911 +0000 UTC End:2021-10-15 07:48:35.911 +0000 UTC}
{Start:2020-06-02 07:48:35.911 +0000 UTC End:2020-06-02 07:48:35.911 +0000 UTC}

好了,本文到此结束,带大家了解了《通过自定义方法解析合并两个字段的 JSON 数据》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>