首页 > 后端开发 > Golang > 如何处理不一致的 JSON 字段:字符串与字符串数组?

如何处理不一致的 JSON 字段:字符串与字符串数组?

DDD
发布: 2024-12-07 22:31:12
原创
650 人浏览过

How to Handle Inconsistent JSON Fields: Strings vs. String Arrays?

用数组和字符串解组不一致的 JSON 字段

当数据不一致时,例如当字段可以字符串或字符串数​​组。为了处理这种情况,我们可以采用各种策略。

使用 RawMessage 捕获不同的数据

对于不同类型的字段,我们可以使用 json.RawMessage 来捕获未解析的数据数据。这允许我们在解组顶级 JSON 后操作该字段。

使用“-”标记隐藏字段

隐藏“DisplayName”字段以防止自动解码,我们可以在结构体定义中使用“-”标记。这可以防止应用程序在顶级解组期间为该字段分配值。

确定字段类型并填充

一旦顶级 JSON 被解码,我们可以检查 RawDisplayName 字段的类型以确定它是字符串还是数组。如果它是字符串,我们将其解组为字符串切片。如果它是一个数组,我们按照原始问题用“&&”连接值。

自定义解组接口

对于具有不同类型的多个字段的场景,它将解析逻辑封装在实现 json.Unmarshaler 接口的自定义类型中可能是有益的。这允许对数据转换过程进行集中控制。

示例实现

以下是处理指定 JSON 的示例实现:

package main

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

type multiString string

func (ms *multiString) UnmarshalJSON(data []byte) error {
    *ms = ""
    if len(data) > 0 {
        switch data[0] {
        case '"':
            var s string
            if err := json.Unmarshal(data, &s); err != nil {
                return err
            }
            *ms = multiString(s)
        case '[':
            var s []string
            if err := json.Unmarshal(data, &s); err != nil {
                return err
            }
            *ms = multiString(strings.Join(s, "&&"))
        }
    }
    return nil
}

type MyListItem struct {
    Date           string      `json:"date"`
    DisplayName    multiString `json:"display_name"`
}

type MyListings struct {
    CLItems []MyListItem `json:"myitems"`
}

func main() {
    var listings MyListings
    err := json.Unmarshal([]byte(`{
        "date": "30 Apr",
        "display_name": "Mr Smith"
    },{
        "date": "30 Apr",
        "display_name": ["Mr Smith", "Mr Jones"]
    }`), &listings)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println(listings)
}
登录后复制

通过使用这些技术,我们可以有效地对具有不同类型字段的 JSON 进行解组,确保应用程序可以正确处理数据。

以上是如何处理不一致的 JSON 字段:字符串与字符串数组?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板